F#:Dictionary,Hashtable和Map之间的区别

时间:2015-03-16 12:55:20

标签: f#

我是.NET编程的新手。对不起,如果之前已经问过这个问题。

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

我还有一个标题中没有提到的问题。我什么时候应该使用Async.RunSynchronously?这似乎与我自相矛盾,所以我确信我错过了一些东西。

1 个答案:

答案 0 :(得分:23)

Dictionary,Hashtable和Map之间的选择取决于用例。但是你应该知道每个人的特征。这不是一个详尽的列表,只是您可能想要开始的一些关键差异:

  • Hashtable 表示根据键的哈希码组织的键/值对的集合。这是来自.NET BCL
  • 的可变集合
  • 字典<> 这是哈希表的通用实现。也是.NET BCL的可变集合
  • 地图这是F#不可变类型。它是基于AVL树实现的,AVL树是一个完全不同的数据结构,具有不同的性能特征和用例。

如果您正在进行多次写入,Hash表集合的填充率性能明显优于AVL树。

使用其键从Dictionary中检索值非常快,接近 O(1),因为Dictionary类是作为哈希表实现的。

F#maps被实现为不可变的AVL树,这是一种形成自平衡二叉树的高效数据结构。 AVL树的效率众所周知,它们可以在 O(log n)时间内搜索,插入和删除树中的元素,其中n是树中元素的数量。

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

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