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

MY_*_*Y_G 17 f#

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

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

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

Tom*_*uλa 26

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

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

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

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

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

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

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

  • 托马斯指出选择正确的关联容器取决于用例,但由于地图是不可变的,人们可以争辩说它们更适合功能风格. (2认同)