2011-04-10 122 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