将F#映射转换为Hashtable

时间:2010-07-06 03:07:12

标签: f# map hashtable

我需要将F#map类转换为System.Collections.Hashtable以供C#使用。

这个问题与以下内容不同: How do you use (get values from keys, add items) Hashtables in F#

该问题询问了如何从哈希表中返回值。我想构建一个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))

3 个答案:

答案 0 :(得分: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类型上运行。

答案 1 :(得分:5)

如果我写这篇文章,我可能更喜欢for循环而不是高阶函数iter。无论如何,你正在编写命令性代码(处理命令式对象),我不认为使用iter使它“更具功能性”。 F#也为命令式编程提供支持,因此在这种情况下我们可以使用那些命令式功能:

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

只有当我不需要将显式lambda函数写为第二个参数时,我通常更喜欢iter函数。例如,如果以下方法有效:

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

如果您可以控制C#代码,也可以考虑在C#中使用IDictionary<'K, 'V>而不是Hashtable。在这种情况下,您可以轻松地传递F#Map<'K, 'V>作为结果,因为map实现了IDictionary<'K, 'V>接口(完全允许从C#顺利使用)。

答案 2 :(得分:4)

您可以使用活动模式KeyValuePair

my_map |> Seq.iter(fun (KeyValue (k,v)) -> myHash.Add(k, v))
相关问题