F#映射到C#字典

25

我想将一个 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#还很新,有更好的方法吗?

3个回答

30

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),而哈希表字典的访问是常数阶。


3
总结他人的答案胜利。 - Daniel
2
@Daniel 我不确定这是不是讽刺的。鼓励重新表述;而且,我最初使用了dict,后来首先提出了Map类型的直接使用,所以它甚至不是“仅仅”一个摘要。无论如何,我的意思并不是不尊重。我立即点赞了jbtule的答案,如果你在不可变性上添加注释或警告,我也会点赞你的。(我犹豫了,因为人们可能期望结果是可变的,然后在运行时得到异常) - Vandroiy
1
实际上,dict并不会给你一个C#字典,以下代码返回false:(Map.empty<int,string> |> Map.toSeq |> dict) :? Dictionary<int,string>。那么问题是,为什么你要在这个问题上使用它,而不是直接使用你的答案呢? - jbtule
3
关于@Daniel关于总结他人答案的评论,虽然引用其他答案是被鼓励的,但不能在同一个问题中进行。http://meta.stackoverflow.com/questions/269396/copy-pasting-the-contents-another-answer-to-the-same-question-with-attribution - jbtule
1
@jbtule 毫无疑问,你的回答是最好的单一响应。但将“C#字典”解释为IDictionary<,>既合理又更通用,因此其他答案也不是错误的。(此外,搜索此内容的人可能并不真正想要他们认为他们想要的,因此一些额外的信息并不会有害。) - Vandroiy
显示剩余4条评论

17

一个 C# Dictionary 在其构造函数中需要传入一个 IDictionary。因为 Map 是一个 IDictionary,所以:

let toDictionary (map : Map<_, _>) : Dictionary<_, _> = Dictionary(map)

9
let toDictionary = Map.toSeq >> dict

1
哦,我忘记了Map.toSeq。请注意,这个字典在更改时会抛出异常,这可能是OP想要的,也可能不是。(谢谢;我编辑了我的答案,也使用了toSeq,因为早期版本的解决方案只是更糟糕) - Vandroiy
虽然这并不实际返回 C# 字典,但它确实返回具有底层字典特性的结构,并且使用函数组合运算符使其非常干净。 - jbtule

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接