我想将一个 F# 的 map 转换为 C# 的 dictionary,目前我正在使用:
let toDictionary (map : Map<_, _>) : Dictionary<_, _> =
let dict = new Dictionary<_, _>()
map |> Map.iter (fun k v -> dict.Add(k, v))
dict
感觉有点笨重,我对F#还很新,有更好的方法吗?
1. 如果你想要标准的字典实现:请参考jbtule的回答
2. 如果你需要一个不可变的,快速的IDictionary:当前F#核心库中的dict函数可以从任何键值对序列创建只读字典:
myDict |> Map.toSeq |> dict
返回值的类型为IDictionary
,因此应该可以从C#中使用。感谢Daniel's answer提醒我使用Map.toSeq。
3. 如果您愿意直接使用Map:Map<,>实现了IDictionary,应该可以方便地从C#中使用。然而,访问映射是O(log n),而哈希表字典的访问是常数阶。
一个 C# Dictionary
在其构造函数中需要传入一个 IDictionary
。因为 Map
是一个 IDictionary
,所以:
let toDictionary (map : Map<_, _>) : Dictionary<_, _> = Dictionary(map)
let toDictionary = Map.toSeq >> dict
dict
并不会给你一个C#字典,以下代码返回false:(Map.empty<int,string> |> Map.toSeq |> dict) :? Dictionary<int,string>
。那么问题是,为什么你要在这个问题上使用它,而不是直接使用你的答案呢? - jbtuleIDictionary<,>
既合理又更通用,因此其他答案也不是错误的。(此外,搜索此内容的人可能并不真正想要他们认为他们想要的,因此一些额外的信息并不会有害。) - Vandroiy