我需要从F#中第一次出现的元素中获取列表的子集。我使用一个简单的递归例程实现了这个,如下所示:
// Returns a subset of a list from the first occurrence of a given item
// e.g. ignoreUpTo "B" ["A";"B";"C";"D"] yields ["C"; "D"]
let rec ignoreUpTo item l =
match l with
| hd::tl -> if hd = item then tl else ignoreUpTo item tl
| _ -> []
这适用于我的需求,但我想知道是否有更好的方法使用F#语言中的现有List函数来完成此操作。
答案 0 :(得分:4)
如果你正在使用F#4,那么现在有一个List.skipWhile
功能;在F#4之前,skipWhile
函数仅在seq
上可用。所以你可以写:
let ignoreUpTo item l =
l
|> List.skipWhile ((<>) item)
|> List.skip 1 // Because otherwise you'll get ["B"; "C"; "D"]
如果您使用的是F#3.1或更早版本,则需要先将您的列表转换为seq
:
let ignoreUpTo item l =
l
|> List.toSeq
|> Seq.skipWhile ((<>) item)
|> Seq.skip 1 // Because otherwise you'll get ["B"; "C"; "D"]
|> Seq.toList // Optional, if you can get by with a seq instead of a list
答案 1 :(得分:3)
您可以使用List.skipWhile
来实现它。如果列表中没有任何元素与项目相同,我假设您要返回空列表。
let ignoreUpTo item l =
match List.skipWhile ((<>) item) l with
| [] -> []
| x :: xs -> xs