我在F#中有一个List<List<int>>
。我需要遍历它,寻找给定的值val
。
在C#中我会做类似的事情:
public bool contains(List<List<int>> list, int value)
foreach (l in list ){
foreach(val in l){
if (val == value)
return true; //found value
}
}
return false;
}
我正在寻找F#中的等价物。我尝试了以下但是我做错了,因为我还不习惯F#语法:
type foo =
{
l : List<List<float>>
}
let contains (value: float) : bool =
for row in foo.l do
for val in row do
if (val == value)
true
false
上面的代码是错误的。
有人可以建议我如何实现这个结果吗?
答案 0 :(得分:9)
另一种略有不同的方式
let contains value items =
items
|> Seq.concat
|> Seq.exists ((=) value)
或者,更简洁
let contains value =
Seq.concat >> Seq.exists ((=) value)
答案 1 :(得分:4)
这是您的C#代码的直接翻译:
let contains value (ls: _ list list) =
let mutable found = false
for row in ls do
if not found then
for el in row do
if not found && el = value then
found <- true
found
要修改F#中变量的值,您应该使用mutable
或ref
个关键字。但是,在F#中执行功能方式:
let contains value ls =
ls |> List.exists (List.exists ((=) value))
与for .. in ... do
不同,这是一个语法糖,高阶函数List.exists
会在找到答案时立即停止。 如果您的列表很大,此版本无法很好地扩展。您可以将列表转换为设置为能够更快地找到元素:
let contains value (ls: _ list list) =
ls |> List.concat |> Set.ofList |> Set.contains value
击> <击> 撞击>