使用 dictionary 而不是 list 来加快对 contains() 的调用

本文关键字:foo contains 调用 list dictionary 使用 | 更新日期: 2023-09-27 18:34:11

我有一个关于 C# 中泛型集合的问题。如果我需要存储项目集合,并且我经常需要检查项目是否在集合中,那么使用字典而不是列表会更快吗?

我听说检查项目是否在集合中相对于列表的大小是线性的,相对于字典的大小是恒定的。使用字典,然后将每个键值对的键和值设置为相同的对象,这是其他程序员在这种情况下经常做的事情吗?

感谢您抽出宝贵时间阅读本文。

使用 dictionary<foo, foo> 而不是 list<foo> 来加快对 contains() 的调用

是的,是的。 也就是说,您可能希望使用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)都依赖于实现良好的EqualsGetHashcode实现来TList<T>只依赖于Equals<</p>

div class="answers">字典

或HashSet将使用更多内存,但提供(几乎)O(1)寻道时间。

你可能想看看HashSet,它是唯一对象的集合(只要对象实现了IEquality比较器)。

你提到使用List<T>,这意味着排序可能很重要。如果是这种情况,那么您可能还需要研究SortedSet<T>类型。