迭代List <list <>&gt;在F#中查找值</list <>

时间:2011-11-30 14:19:28

标签: c# list syntax f# foreach

我在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

上面的代码是错误的。

有人可以建议我如何实现这个结果吗?

2 个答案:

答案 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#中变量的值,您应该使用mutableref个关键字。但是,在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

<击>