我需要将F#map类转换为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) )
Run Code Online (Sandbox Code Playgroud)
编辑:谢谢你的回答.这是我决定使用的:
let my_map = Map [(1, "one"); (2, "two")]
let myHash = Hashtable()
my_map |> Map.iter (fun k v -> myHash.Add(k, v))
Run Code Online (Sandbox Code Playgroud)
这段代码编译.
let my_map = Map( [(1, "one"); (2, "two")] )
let myHash = Hashtable()
my_map |> Map.iter (fun k v -> myHash.Add(k, v) )
Run Code Online (Sandbox Code Playgroud)
原始的不编译,因为类型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)
Run Code Online (Sandbox Code Playgroud)
我通常iter只在不需要将显式lambda函数写为第二个参数时更喜欢函数.例如,如果以下方法有效:
myMap |> Seq.iter myHash.Add // This doesn't work, so I prefer 'for' instead
Run Code Online (Sandbox Code Playgroud)
如果你可以控制C#代码,你也可以考虑只使用IDictionary<'K, 'V>C#而不是Hashtable.在这种情况下,您可以轻松地传递F#Map<'K, 'V>作为结果,因为map实现了IDictionary<'K, 'V>接口(完全允许从C#顺利使用).