2010-07-06 72 views
1

我需要將F#映射類轉換爲System.Collections.Hashtable以供C#使用。將F#映射轉換爲Hashtable

這個問題是不一樣的,如下: How do you use (get values from keys, add items) Hashtables in F#

這個問題問如何從一個Hashtable返回值。我想構建一個F#映射,然後將其轉換爲System.Collections.Hashtable。

我該怎麼做?

非常感謝。

這是我曾嘗試(不編譯):

#light 

open System 
open System.Collections 
open System.Collections.Generic 

let my_map = dict [(1, "one"); (2, "two")] 


let myHash = Hashtable() 
my_map |> Map.iter (fun k v -> myHash.Add(k, v)) 

編輯:謝謝您的回答。這是我決定使用的:

let my_map = Map [(1, "one"); (2, "two")] 

let myHash = Hashtable() 
my_map |> Map.iter (fun k v -> myHash.Add(k, v)) 

回答

5

此代碼編譯。

let my_map = Map([(1, "one"); (2, "two")]) 

let myHash = Hashtable() 

my_map |> Map.iter (fun k v -> myHash.Add(k, v)) 

原來不編譯因爲dict [(1, "one"); (2, "two")]類型是IDictionary<int, string>,不Map。而Map。*功能族需要在F#Map類型上操作。

4

你可以使用主動模式KeyValuePair

my_map |> Seq.iter(fun (KeyValue (k,v)) -> myHash.Add(k, v)) 
5

如果我在寫這個,我可能會更喜歡for循環,而不是高階函數iter。無論如何,你正在編寫命令式代碼(用於處理命令式對象),我不認爲使用iter會使它更「功能化」。 F#提供了命令式編程的支持爲好,這樣我們就可以在這種情況下使用這些功能勢在必行:

let myHash = Hashtable() 
for (KeyValue(k, v)) in myMap do 
    myHash.Add(k, v) 

我通常喜歡iter功能只有當我不需要寫明確的lambda函數作爲第二個參數。例如,如果下面將工作:

myMap |> Seq.iter myHash.Add // This doesn't work, so I prefer 'for' instead 

如果你有在C#代碼一些控制,你也可以只在C#中,而不是使用Hashtable考慮IDictionary<'K, 'V>。在這種情況下,您可以輕鬆地通過F#Map<'K, 'V>作爲結果,因爲地圖實現了IDictionary<'K, 'V>接口(完全可以讓C#順利使用)。

相關問題