F#查找具有某些条件的字典条目

时间:2011-12-12 19:20:40

标签: f#

let dTuples = new Dictionary<int, string * string * int>()
dTuples.Add(1, ("A", "OK", 1))
dTuples.Add(2, ("B", "NOK", 2))
dTuples.Add(3, ("C", "OK", 3))

我想在字典中找到值在“值”部分的第二个元素中“OK”的项目。 我还想将结果转换为元组数组而不使用字典的关键部分。 对于上面的例子,我需要这个:

let tuplesOK = [| ("A", "OK", 1); ("C", "OK", 3) |]

如果您提供代码,请同时添加一些解释,以便我更好地理解! 谢谢, 约翰

2 个答案:

答案 0 :(得分:5)

检查匹配“OK”的第二个元组项:

dTuples |> Seq.filter (fun (KeyValue(_, (_,ok,_))) -> ok = "OK") |> Seq.toArray

获取元组数组(不带键):

dTuples.Values |> Seq.toArray

如果您不需要可变性,可以使用dict[MSDN]运算符更简洁地构建字典。

let dTuples = 
  dict [
    1, ("A", "OK", 1)
    2, ("B", "NOK", 2)
    3, ("C", "OK", 3)
  ]

我不会把它变成教程。代码非常明显,任何差距都可以通过快速搜索MSDN来填补。

答案 1 :(得分:3)

Daniel的解决方案清楚地回答了你的问题,但是如果你需要根据键之外的其他内容在字典中执行查找,那么你可能需要考虑使用不同的数据结构,因为没有必要使用词典。也许你可以使用一个列表:

let data =
  [ ("A", "OK", 1)
    ("B", "NOK", 2)
    ("C", "OK", 3) ]

然后使用Seq.filter执行查找,就像在Daniel的解决方案中一样:

data |> Seq.filter (fun (_, ok, _) -> ok = "OK")
     |> Seq.toArray

或者,如果您需要经常执行查找,可以使用第二个元素(OK / NOK标志)对值进行分组,然后使用dict函数将其存储在字典中:

// build a dictionary with second element of the tuple as a key 
let lookupOk = data |> Seq.groupBy (fun (_, ok, _) -> ok) |> dict

// get a sequence of 'OK' values
lookupOk.["OK"]