2011-04-10 155 views
0

下面的代码列出了在字典序列中找到的一组键(每个字典基本上是来自数据库的一行)。 (我想键转换为一组,所以我可以比较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     
        ) 

缺少什么我在这里?

回答

3

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

使用Seq.map,而不是Seq.iter

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