繁体   English   中英

将F#映射转换为哈希表

[英]Convert a F# map to a Hashtable

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

这个问题与以下内容不同: 如何在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))

这段代码会编译。

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")] dict [(1, "one"); (2, "two")]IDictionary<int, string> ,不是Map 而且Map。*函数族需要在F#Map类型上运行。

如果我正在写这篇文章,我可能更喜欢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#顺利使用)。

您可以使用活动模式KeyValuePair

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM