2010-11-26 166 views
8

我试图以功能方式创建词典。我打了一下它,并能够连接两个字典与此代码:使用不可变词典

let d1 = dict [(1, "one"); (2, "two")] 
let d2 = dict [(4, "four")] 
let d = List.ofSeq d1 @ List.ofSeq d2 

这是在F#一成不变的字典工作的正确方法是什么?这似乎有点复杂。

回答

20

dict函数主要是帮助程序,如果您已经有一个包含所有项目的列表,那么它将根据列表创建一个字典。当你想要添加元素的时候,它并不是那么有用,也就是说,创建包含原始元素的所有元素的新字典以及一些新元素。

在这种情况下,最好使用Map类型。

// Create map from a list 
let m1 = Map.ofSeq [ (1, "one"); (2, "two") ] 
// Create map from original map by adding one element 
let m2 = m1.Add(4, "four") 

m1所有元素添加到m2,你可能会写:

let newM2 = m1 |> Seq.fold (fun m (KeyValue(k, v)) -> Map.add k v m) m2 
+0

如果你想使用并行词典?地图可以代替吗?我猜Map会有点慢,因为每次添加新元素时都会返回一个新字典? – Kafo 2017-12-01 01:41:25