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) |]
如果您提供代码,请同时添加一些解释,以便我更好地理解! 谢谢, 约翰
答案 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"]