使用 dictionary 而不是 list 来加快对 contains() 的调用
本文关键字:foo contains 调用 list dictionary 使用 | 更新日期: 2023-09-27 18:34:11
我有一个关于 C# 中泛型集合的问题。如果我需要存储项目集合,并且我经常需要检查项目是否在集合中,那么使用字典而不是列表会更快吗?
我听说检查项目是否在集合中相对于列表的大小是线性的,相对于字典的大小是恒定的。使用字典,然后将每个键值对的键和值设置为相同的对象,这是其他程序员在这种情况下经常做的事情吗?
感谢您抽出宝贵时间阅读本文。
是的,是的。 也就是说,您可能希望使用HashSet
,因为您不需要键和值,您只需要一组项目。
还值得注意的是,Dictionary
是在 C# 2.0 中添加的,HashSet
是在 3.5 中添加的,所以在两者之间的这段时间里,当你想要一个 Set 时,使用字典实际上是相当普遍的,因为这就是你所拥有的一切(而不是滚动你自己的)。 当我被迫这样做时,我只是在值中停留了 null,而不是将项目作为键和值,但想法是相同的。
关心的是快速遏制测试,请使用HashSet<Foo>
。
Dictionary<TKey, TValue>
用于根据键查找值。
List<T>
用于随机访问和动态增长属性。
HashSet<T>
用于对集合进行建模并提供快速的遏制测试。
您不是在查找基于键的值。您不必担心随机访问,而是快速的遏制检查。这里的正确概念是HashSet<T>
.
假设列表中只有一个项目的副本,则ISet<T>
适当的数据结构,特别是HashSet<T>
。
也就是说,我已经看到时间表明Dictionary<TKey, TValue>
ContainsKey
呼叫甚至比HashSet<T>
快一点。 无论哪种方式,它们都将比普通List<T>
查找加载得更快。
请记住,这两种方法(HashSet 和 Dictionary)都依赖于实现良好的Equals
和GetHashcode
实现来T
。 List<T>
只依赖于Equals
<</p>
或HashSet将使用更多内存,但提供(几乎)O(1)寻道时间。
你可能想看看HashSet,它是唯一对象的集合(只要对象实现了IEquality比较器)。
你提到使用List<T>
,这意味着排序可能很重要。如果是这种情况,那么您可能还需要研究SortedSet<T>
类型。