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