有人能解释一下为什么泛型List.Contains()
函数这么慢吗?
我有一个大约有一百万个数字的List<long>
,代码会不断地检查这些数字中是否有特定的数字。
我尝试使用Dictionary<long, byte>
和Dictionary.ContainsKey()
函数做同样的事情,它比使用List快10-20倍。
当然,我并不是真的想使用Dictionary来达到这个目的,因为它本来就不是这样用的。
所以,这里真正的问题是,有没有List<T>.Contains()
的替代品,而不是像Dictionary<K,V>.ContainsKey()
那样古怪?
发布于 2009-05-05 08:27:35
如果你只是在检查是否存在,.NET 3.5中的HashSet<T>
是你最好的选择-类似字典的性能,但没有键/值对-只有值:
HashSet<int> data = new HashSet<int>();
for (int i = 0; i < 1000000; i++)
{
data.Add(rand.Next(50000000));
}
bool contains = data.Contains(1234567); // etc
发布于 2009-05-05 08:25:56
List.Contains是一个O(n)运算。
Dictionary.ContainsKey是一个O(1)操作,因为它使用对象的哈希码作为关键字,这为您提供了更快的搜索能力。
我不认为浏览一个包含一百万个条目的列表来找到几个条目是个好主意。
例如,是否可以将这些上百万个实体保存到RDBMS中,并在该数据库上执行查询?
如果这是不可能的,那么我会使用字典,无论如何,如果你想做关键字查找。
发布于 2009-05-05 08:25:09
字典并没有那么糟糕,因为字典中的键被设计为可以快速找到。为了在列表中找到一个数字,它需要遍历整个列表。
当然,只有当你的数字是唯一的并且没有排序的时候,字典才能工作。
我认为在.NET 3.5中也有一个HashSet<T>
类,它也只允许唯一的元素。
https://stackoverflow.com/questions/823860
复制相似问题