何时使用HashTable
在C#中,我发现自己在99%的时间内使用List
, IList
或IEnumerable
。 是否有一种情况,在这些情况下使用HashTable
(或2.0以上的Dictionary
)会更好?
编辑:
正如所指出的那样,有人想对这个集合做什么通常会决定一个人应该使用什么,所以你何时会在List
使用Hashtable
/ Dictonary
List
?
也许与OPs问题没有直接关系,但是有一篇关于在哪个集合结构中使用的有用博客文章: SortedSets
基本上,您想要对集合执行的操作决定了您应该创建的集合类型。
总结一下:
- 如果您希望能够枚举和/或修改集合,请使用IList(通常在列表末尾添加)
- 如果你只想枚举集合,则使用IEnumeration(不需要添加/删除 – 通常用作返回类型)
- 如果要通过键访问元素(使用键快速添加/删除元素),请使用IDictionary
-
如果要以预定义的顺序访问集合,请使用SortedSet(最常见的用法是按顺序访问集合)
-
总的来说,如果你想按键没有特定的顺序访问/修改项目,请使用Dictionary(首选列表通常按顺序排列,优先于枚举,因为你不能修改枚举,首选哈希表,因为它不是严格键入的,当你不需要键排序时,首选优于sortedlist)
当您希望基于键快速查找项目时,可以使用哈希表(字典)。
如果您正在使用List, IList or IEnumerable
这通常意味着您正在循环数据(在IEnumerable的情况下,它肯定意味着),并且哈希表不会为您提供任何支持。 现在,如果您在一个列表中查找值并使用它来访问另一个列表中的数据,那就会有所不同。 例如:
- 在Item foo列表中查找位置。
- foo列表中的位置对应于包含Foo_Value的另一个列表中的位置。
- 访问位置以秒为单位列表以获取Foo_Value。
这是一个描述不同数据类型的链接 。
另一个环节。
当您需要能够(快速)按键查找项目时,请使用hashtable
。
当然,您可以在IList
或IEnumerable
等中搜索匹配的键,但是对于Hashtable
或Dictionary
,这将花费O(n)时间而不是O(1)。
如果你经常做“collections中的东西”并且你不关心集合中项目的顺序,那么散列表是很好的选择。
散列表是索引。 您可以维护一个哈希表来索引列表,这样您就可以选择按顺序访问它,也可以根据密钥随机访问它。
你不是真的在比较相同的东西,当我使用字典时,因为我想查找数据,通常我想存储一个对象列表,我希望能够使用一个键快速查找它们某种。
我经常使用Hashtables通过页面方法将键/值集合发送回Javascript。
当你需要检索一个给定ID但又不想访问数据库的对象时,字典很适合缓存事物:假设你的集合不够大而不能引发大量冲突而你的数据需要经常检索到一个IEnumerable太慢,字典可以提供一个体面的加速。
如果不知道集合的用途 ,就无法确切地说出来,但除非集合中的项目是唯一的,否则您不能使用散列表,因为没有什么可以用作密钥。 因此,您可能正在寻找的经验法则是,如果您的成员完全不同,并且您希望通过键拉出单个实例,请使用哈希表。 如果您想要以相同的方式处理一堆项目(例如在整个集合上执行foreach),请使用列表。
Hashtable优化查找。 它计算您添加的每个键的哈希值。 然后它使用此哈希代码非常快速地查找元素。 它是较旧的.NET Framework类型。 它比通用的Dictionary类型慢。