2014-11-24 131 views
17

我想轉換的F#映射到一個C#字典,到目前爲止我使用:F#映射到C#字典

let toDictionary (map : Map<_, _>) : Dictionary<_, _> = 
     let dict = new Dictionary<_, _>() 
     map |> Map.iter (fun k v -> dict.Add(k, v)) 
     dict 

我就覺得有點麻煩,我是相當新的F#這樣它有更好的方法嗎?

回答

22

1.如果你想在標準字典實現:See the answer of jbtule

2.如果你想要一個不可改變的,快速的IDictionary:從目前的F#核心庫the dict function允許創建一個只讀的字典從鍵值元組的任何序列:

myDict |> Map.toSeq |> dict 

返回值的類型爲IDictionary並且因此應該是從C#可用。 感謝Daniel's answer讓我想起Map.toSeq。

3.如果你很好用地圖直接:地圖<,>實現IDictionary的,這應該是方便的從C#中使用。但是,映射的訪問是O(log n),而基於散列的字典訪問是不變的順序。

+3

總結別人的答案FTW。 – Daniel 2014-11-24 17:12:46

+1

@Daniel我不確定這是不是諷刺。重新鼓勵;此外,我首先使用了字典,後來首次提出直接使用Map類型,所以它甚至不是「僅」的摘要。無論哪種方式,我的意思是不敬。我立即提出了jbtule的回答,如果你在不變性上添加註釋或警告,我也會讚揚你的。 (我猶豫了,因爲人們可能期望結果是可變的,然後在運行時得到一個異常) – Vandroiy 2014-11-24 18:25:26

+1

實際上'dict'不給你ac#字典,下面返回false'(Map.empty |> Map。 toSeq |>字典):?詞典'所以問題是你爲什麼要使用它來直接使用*來回答這個問題。 – jbtule 2014-11-24 18:41:29

9

C#Dictionary將在其構造函數中使用IDictionaryMapIDictionary這樣:

let toDictionary (map : Map<_, _>) : Dictionary<_, _> = Dictionary(map) 
7
let toDictionary = Map.toSeq >> dict 
+1

哦,我忘了Map.toSeq。請注意,雖然這本字典會在變化上拋出一個異常,這可能或不可能是OP想要的。 (謝謝;我編輯了我的答案以使用toSeq,因爲早期版本的解決方案更糟糕) – Vandroiy 2014-11-24 17:06:29

+0

儘管這實際上並不返回C#字典。它確實返回一個具有底層字典特性的結構,並且使用函數組合操作符使其非常乾淨。 – jbtule 2014-11-24 18:46:33