我对C#中的泛型集合有疑问。如果我需要存储项目集合,并且我经常需要检查项目是否在集合中,那么使用Dictionary而不是List会更快吗?
我听说检查项目是否在集合中是相对于列表大小是线性的还是相对于字典大小的常量。是否正在使用Dictionary,然后将Key和Value设置为每个键值对的同一对象,这是其他程序员在这种情况下经常做的事情?
感谢您花时间阅读本文。
答案 0 :(得分:5)
是的,是的。也就是说,您可能希望使用HashSet
,因为您不需要键和值,只需要一组项目。
值得注意的是,在{C + 2.0}中添加了Dictionary
,并且在3.5中添加了HashSet
,因此在中间的所有时间内,当您需要一个集合时,使用字典实际上相当常见只是因为那是你所拥有的(没有自己动手)。当我被迫这样做时,我只是在值中保留null,而不是将项目作为键和值,但这个想法是相同的。
答案 1 :(得分:5)
如果您关注的是快速遏制测试,请使用HashSet<Foo>
。
Dictionary<TKey, TValue>
用于根据密钥查找值。
List<T>
用于随机访问和动态增长属性。
HashSet<T>
用于建模集并提供快速遏制测试。
您没有根据密钥查找值。您不担心随机访问,而是快速控制检查。这里正确的概念是HashSet<T>
。
答案 2 :(得分:5)
假设列表中只有一个项目副本,那么相应的数据结构为ISet<T>
,具体为HashSet<T>
。
那就是说,我看到时间表明Dictionary<TKey, TValue>
ContainsKey
来电比HashSet<T>
快了一点。无论哪种方式,它们都将比普通List<T>
查找更快地加载。
请记住,这两种方法(HashSet和Dictionary)都依赖于Equals
和 GetHashcode
相当完善的实现{ {1}}。 T
仅依赖于List<T>
答案 3 :(得分:3)
字典或HashSet将使用更多内存,但提供(几乎)O(1)寻道时间。
答案 4 :(得分:2)
您可能希望查看HashSet,它是唯一对象的集合(只要该对象实现了IEquality comparer)。
答案 5 :(得分:1)
您提到使用List<T>
,这意味着排序可能很重要。如果是这种情况,那么您可能还想查看SortedSet<T>
类型。