关于c#:何时使用HashTable


When to use a HashTable

在C中,我发现自己99%的时间都在使用ListIListIEnumerable。在这种情况下,使用EDOCX1(或2.0及以上版本的EDOCX1(或4))是否更好?

编辑:

正如所指出的,某人想对收集做什么,往往决定了应该使用什么,所以您什么时候使用HashTableDictonary而不是List


可能与ops问题没有直接关系,但是有一篇有用的博客文章,关于在:sortedsets使用哪个收集结构

基本上,您想对集合做什么决定了应该创建什么类型的集合。

要更详细地总结:

  • 如果希望能够枚举和/或修改集合(通常在列表末尾添加),请使用ilist。
  • 如果只想枚举集合,请使用IEnumeration(不需要添加/删除-通常用作返回类型)
  • 如果要通过键访问元素,请使用IDictionary(使用键快速添加/删除元素)
  • 如果要按预定义顺序访问集合,请使用SortedSet(最常见的用法是按顺序访问集合)

  • 总的来说,如果您不想以特定的顺序按键访问/修改项目,请使用字典(优先于按顺序执行的列表,优先于不能修改枚举的枚举,优先于未严格键入的哈希表,不需要排序键时优先于排序列表)


当需要基于键快速查找对项的访问时,可以使用哈希表(字典)。

如果您使用的是List, IList or IEnumerable,一般来说,这意味着您正在循环数据(在IEnumerable的情况下,它肯定意味着这),哈希表不会为您提供任何东西。现在,如果您在一个列表中查找一个值,并使用该值访问另一个列表中的数据,这会有点不同。例如:

  • 在项目foo列表中查找位置。
  • foo列表中的位置对应于另一个包含foo_值的列表中的位置。
  • 访问秒列表中的位置以获取foo_值。
  • 下面是一个描述不同数据类型的链接。

    另一个链接。


    当您需要能够(快速)按键查找项目时,使用hashtable

    当然,您可以通过IListIEnumerable等搜索匹配的密钥,但对于hashtableDictionary,这需要O(n)时间而不是O(1)。


    如果您经常"为集合中的某个内容"而不关心集合中项目的顺序,那么哈希表是很好的选择。

    哈希表是索引。您可以维护一个哈希表来索引一个列表,这样您可以选择按顺序访问它,也可以根据键随机访问它。


    哈希表优化查找。它计算您添加的每个键的散列值。然后,它使用这个哈希代码快速查找元素。它是旧的.NET框架类型。它比一般字典类型慢。


    在不知道集合的用途的情况下,无法准确地判断,但除非集合中的项是唯一的,否则不能使用哈希表,因为没有任何项可以用作键。因此,您要寻找的经验法则可能是,如果您的成员都不同,并且您希望按键拉出各个实例,那么可以使用哈希表。如果你有一堆你想用同样的方法处理的项目(比如在整个集合中做一个foreach),使用一个列表。


    我经常使用哈希表通过页面方法将键/值集合发送回JavaScript。

    当您需要根据对象的ID检索对象,但不想访问数据库时,字典很适合缓存对象:假设您的集合不够大,无法引发大量冲突,并且您的数据需要经常检索,以使IEnumerable速度过慢,则字典可以提供相当快的速度。


    你不是真的在比较相同的东西,当我使用字典的时候,是因为我想查找数据,通常我想存储一个对象列表,我想能够使用某种键快速查找它们。