【问题标题】:List vs Dictionary (Hashtable)列表与字典(哈希表)
【发布时间】:2013-01-15 21:58:59
【问题描述】:

这可能是一个愚蠢的问题,但我了解到HashtablesDictionaries 比列表更快,因为它们使用键索引项目。

我知道ListArray 用于没有值的元素,Dictionary 用于有值的元素。所以我认为拥有一个Dictionary 具有您需要的值作为键并且所有值都相等可能是明智的?

更新

根据 cmets,我认为我需要的是 HashSet。这个question 谈论他们的表现。

【问题讨论】:

  • Hashtables and Dictionarys are faster than a list。取决于你用它们做什么。
  • A HashSet 将提供您正在考虑使用 Dictionary 并使用键而不是值的功能。问题在于它们必须是唯一的,但使用 Dictionray
  • "value that you need as a key" 如果您有重复的值,这将是不可能的

标签: c# .net


【解决方案1】:

“更快”取决于您需要它们。

.NET List 只是一块连续内存(这在不是链表中),这使得顺序访问非常有效(尤其是当您考虑缓存和现代 CPU 的预取)或“随机”通过已知的 integer 索引。搜索或插入元素(尤其是在中间) - 不是那么多。

Dictionary 是一种关联数据结构 - 键可以是任何可散列的(不仅仅是整数索引),但元素不会以“有意义”的方式排序,并且通过已知键的访问速度不如 @987654323 @ 的整数索引。

所以,为工作选择合适的工具吧。

【讨论】:

    【解决方案2】:

    Dictionary/Hashtable 与 List/array 相比也有一些弱点:

    • 您必须在每次查找时计算对象的哈希值。
    • 对于小型集合,遍历数组可能比计算该哈希更快,尤其是因为不能保证哈希是唯一的1
    • 它们不擅长迭代项目列表。
    • 它们不太擅长存储重复条目(有时您希望某个值在数组中多次显示)
    • 有时一个类型没有一个好的键来与之关联

    使用适合的情况。有时这将是一个列表或数组。有时它会是一个字典。您几乎不应该再使用 HashTable(如果您真的不知道要存储的类型,则更喜欢 Dictionary)。

    1它通常是唯一的,但是由于存在很小的冲突可能性,因此集合必须在计算哈希值后检查存储桶。

    【讨论】:

      【解决方案3】:

      您的说法“列表或数组适用于没有值的元素,而字典适用于有值的元素”,严格来说并不正确。

      更准确地说,List 是元素的集合,而 Hashtable 或 Dictionary 是元素的集合以及用于访问每个元素的唯一键。

      为极少数元素的集合使用列表,或者当您只需要访问整个集合而不是集合的单个元素时。

      当集合很大和/或当您需要查找/访问集合的各个成员时,请使用哈希表或字典。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-18
        • 2016-03-31
        • 2013-03-21
        • 2012-08-23
        • 2014-01-04
        • 1970-01-01
        • 2010-10-18
        • 2023-03-31
        相关资源
        最近更新 更多