将字典键序列转换为集合

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)

我在这里缺少什么?

Tom*_*cek 5

使用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)