将字典键序列转换为集
问题描述:
下面的代码列出了在字典序列中找到的一组键(每个字典基本上是来自数据库的一行)。 (我想键转换为一组,所以我可以比较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
)
缺少什么我在这里?
答
使用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 ] |]
答
使用Seq.map
,而不是Seq.iter
:
let get_keyset tblseq =
tblseq
|> Seq.map (fun (x:Dictionary<_,_>) -> x.Keys |> set)
|> Array.ofSeq