【问题标题】:Convert a sequence of dictionary keys to a set将字典键序列转换为集合
【发布时间】:2011-08-02 16:37:45
【问题描述】:

以下代码列出了在字典序列中找到的一组键(每个字典基本上是数据库中的一行)。 (我想将键转换为一组,以便比较 2 个 db 表)

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                   
                     ) 

我在这里错过了什么?

【问题讨论】:

    标签: f# dictionary set sequence key


    【解决方案1】:

    使用Seq.map 而不是Seq.iter

    let get_keyset tblseq =
        tblseq
        |> Seq.map (fun (x:Dictionary<_,_>) -> x.Keys |> set)
        |> Array.ofSeq
    

    【讨论】:

      【解决方案2】:

      按照 ildjarn 的建议使用 Seq.map 是一种选择(您可能希望在末尾添加 Array.ofSeq 以获取您在查询中所说的集合数组)。

      另一种方法是使用数组解析:

      let get_keyset (tblseq:seq<System.Collections.Generic.Dictionary<_, _>>) = 
          [| for x in tblseq -> x.Keys |> Set.ofSeq |]
      

      符号[| .. |] 表示您要创建一个元素数组,-&gt; 后面的表达式指定应作为元素生成的内容。该语法本质上只是编写Seq.map 的一种更好的方式(尽管它支持更多功能)。

      您也可以使用此语法创建集合(而不是调用Set.ofSeq)。在这种情况下,它没有多大意义,因为Set.ofSeq 更快更简洁,但有时它是一个非常简洁的选择。它允许您避免类型注释,因为您可以使用KeyValue 模式获取字典的键:

      let get_keyset tblseq = 
          [| for x in tblseq ->
               set [ for (KeyValue(k, v)) in x -> k ] |]
      

      【讨论】:

        猜你喜欢
        • 2022-11-12
        • 1970-01-01
        • 2021-02-04
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        相关资源
        最近更新 更多