2010-07-06 166 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#顺利使用)。

相关问题