F#:字典、哈希表和映射之间的区别

F#: Difference between Dictionary, Hashtable and Map

我是 .NET 编程新手。抱歉,如果之前有人问过这个问题。

我目前正在学习 F#。 Dictionary、Hashtable 和 Map 之间有什么区别?我应该什么时候使用它们?

我还有一个标题没有提到的问题。我应该什么时候使用 Async.RunSynchronously?对我来说似乎 self-contradictory,所以我确信我遗漏了一些东西。

Dictionary、Hashtable 和 Map 之间的选择取决于用例。但是,您应该知道每个的特征。这不是一个详尽的列表,只是您可能希望从中着手的一些关键差异:

  • Hashtable表示根据key的哈希码组织的key/value对的集合。这是来自 .NET BCL
  • 的 mutable 集合
  • Dictionary<> 这是 hashtable 的通用实现。也是来自 .NET BCL
  • 的 mutable 集合
  • Map 这是F# immutable类型。它是基于 AVL 树实现的,AVL 树是一种完全不同的数据结构,具有不同的性能特征和用例。

如果您进行大量写入,哈希 tables 集合的填充率性能明显优于 AVL 树。

使用字典的键从字典中检索值非常快,接近于 O(1),因为字典 class 是作为散列 table.

F# 映射作为 immutable AVL 树实现,这是一种形成自平衡二叉树的高效数据结构。 AVL树以高效着称,在树中查找、插入、删除元素的时间为O(log n),其中n为树中元素的个数树。

对于地图用例,如果您有一组静态数据(例如应用程序启动时加载的配置数据),您需要经常按键查找,地图与作为任何选择,它在这种情况下的不变性确保静态数据不会被错误 mod 化,并且对性能影响很小,因为一旦初始化就永远不需要改变它。

Async.RunSynchronously 运行提供的异步计算并等待其结果。例如,您可以在 F# 交互式 window 中使用它来测试您的异步工作流。