将一系列字典键转换为一组

时间:2011-04-10 23:26:17

标签: f# dictionary set sequence key

以下代码列出了在字典序列中找到的键集(每个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                   
                     ) 

我在这里缺少什么?

2 个答案:

答案 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