【问题标题】:When to use a HashTable何时使用哈希表
【发布时间】:2011-03-04 22:07:16
【问题描述】:

在 C# 中,我发现自己 99% 的时间都在使用 List<T>IList<T>IEnumerable<T>。在这些情况下,是否最好使用 HashTable(或 2.0 及更高版本中的 Dictionary<T,T>)?

编辑:

正如所指出的,人们想对集合做什么通常决定了人们应该使用什么,那么你什么时候会使用Hashtable/Dictonary<T,T> 而不是List<T>

【问题讨论】:

    标签: c#


    【解决方案1】:

    可能与 OPs 问题没有直接关系,但有一篇有用的博客文章介绍了使用哪种集合结构:SortedSets

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

    更详细地总结一下:

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

    • 总体而言,如果您想按特定顺序通过键访问/修改项目,请使用字典(优先于列表,因为这通常按顺序完成,优先于枚举,因为您无法修改枚举,优先于哈希表因为这不是严格键入的,所以当您不需要对键进行排序时,优先于 sortedlist)

    【讨论】:

    • 为了进一步区分 Sets 和其他 Collections:一个 set 不允许在其中重复元素(并且 SortedSet 等不会抛出异常来告诉你这一点,但 .Add() 将返回一个布尔值告诉你)。因此,虽然在某些情况下您可能需要有序列表,但 SortedSet 可能不是理想的集合。
    【解决方案2】:

    当您希望基于键快速查找访问项目时,您可以使用哈希表(字典)。

    如果您使用List, IList or IEnumerable,这通常意味着您正在循环数据(在 IEnumerable 的情况下,这绝对意味着),并且哈希表不会为您带来任何好处。现在,如果您在一个列表中查找一个值并使用它来访问另一个列表中的数据,那会有点不同。例如:

    1. 在项目 foo 列表中查找位置。
    2. foo 在列表中的位置对应于另一个包含 Foo_Value 的列表中的位置。
    3. 以秒为单位访问位置以获取 Foo_Value。

    这是描述不同数据类型的link

    Another link.

    【讨论】:

      【解决方案3】:

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

      当然,您可以通过 IListIEnumerable 等搜索匹配键,但对于 HashtableDictionary,这将花费 O(n) 时间而不是 O(1)。

      【讨论】:

        【解决方案4】:

        如果您经常为“in 集合中的某物”做事,并且不关心集合中项目的顺序,那么哈希表是不错的选择。

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

        【讨论】:

          【解决方案5】:

          Hashtable 优化查找。它计算您添加的每个键的哈希值。然后它使用这个哈希码非常快速地查找元素。它是一种较旧的 .NET Framework 类型。它比通用 Dictionary 类型慢。

          【讨论】:

          • 你有 Hashtable 变慢的参考吗?
          【解决方案6】:

          您实际上并没有比较相同的东西,当我使用字典时,这是因为我想查找数据,通常我想存储一个对象列表并且我希望能够快速查找它们使用某种键。

          【讨论】:

            【解决方案7】:

            我经常使用 Hashtables 通过页面方法将键/值集合发送回 Javascript。

            当您需要检索给定 ID 的对象但又不想访问数据库时,字典非常适​​合缓存内容:假设您的集合不足以引发大量冲突并且您的数据需要检索通常足以让 IEnumerable 太慢,但字典可以提供不错的加速。

            【讨论】:

              【解决方案8】:

              如果不知道集合是什么用于,就无法准确判断,但是除非集合中的项目是唯一的,否则您不能使用哈希表,因为没有任何东西可以用作键。因此,也许您正在寻找的经验法则是,如果您的成员都是不同的,并且您想通过键提取单个实例,请使用哈希表。如果您有一堆想要以相同方式处理的项目(例如对整个集合进行 foreach),请使用列表。

              【讨论】:

                猜你喜欢
                • 2017-02-27
                • 2014-12-22
                • 2016-07-11
                • 2023-03-31
                • 1970-01-01
                • 2023-03-27
                • 2012-09-16
                • 2013-03-21
                相关资源
                最近更新 更多