以下代码列出了在字典序列中找到的键集(每个dict基本上都是数据库中的一行)。 (我想将密钥转换为集合,因此我可以比较2个数据库表)
for seqitem in tblseq do
let keyset = seqitem.Keys |> Set.ofSeq // works correctly
printfn ">>> List: %A; Item Type: %A" keyset
而不是打印键集,但我想从函数返回它,但我遇到了类型推断的问题。试过以下但不起作用;
我想要做的是将这些值作为列表数组(而不是打印它们)返回
let get_keyset tblseq =
tblseq |> Seq.iter (fun x ->
x.Keys |> Set.ofSeq
)
我在这里缺少什么?
答案 0 :(得分:4)
使用Seq.map
作为ildjarn建议是一个选项(您可能希望在结尾添加Array.ofSeq
以获取您在qurestion中所说的数组)。
另一种方法是使用数组理解:
let get_keyset (tblseq:seq<System.Collections.Generic.Dictionary<_, _>>) =
[| for x in tblseq -> x.Keys |> Set.ofSeq |]
符号[| .. |]
表示您要创建元素数组,->
后面的表达式指定应该作为元素生成的内容。语法基本上只是编写Seq.map
的更好方法(虽然它支持更多功能)。
您也可以使用此语法创建集(而不是调用Set.ofSeq
)。在这种情况下,它没有多大意义,因为Set.ofSeq
更快更好,但有时它是非常简洁的选择。它允许您避免使用类型注释,因为您可以使用KeyValue
模式获取字典的键:
let get_keyset tblseq =
[| for x in tblseq ->
set [ for (KeyValue(k, v)) in x -> k ] |]
答案 1 :(得分:1)
使用Seq.map
而不是Seq.iter
:
let get_keyset tblseq =
tblseq
|> Seq.map (fun (x:Dictionary<_,_>) -> x.Keys |> set)
|> Array.ofSeq