首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >List<T>.Contains()很慢吗?

List<T>.Contains()很慢吗?
EN

Stack Overflow用户
提问于 2009-05-05 08:21:25
回答 7查看 56K关注 0票数 98

有人能解释一下为什么泛型List.Contains()函数这么慢吗?

我有一个大约有一百万个数字的List<long>,代码会不断地检查这些数字中是否有特定的数字。

我尝试使用Dictionary<long, byte>Dictionary.ContainsKey()函数做同样的事情,它比使用List快10-20倍。

当然,我并不是真的想使用Dictionary来达到这个目的,因为它本来就不是这样用的。

所以,这里真正的问题是,有没有List<T>.Contains()的替代品,而不是像Dictionary<K,V>.ContainsKey()那样古怪?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 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
票数 166
EN

Stack Overflow用户

发布于 2009-05-05 08:25:56

List.Contains是一个O(n)运算。

Dictionary.ContainsKey是一个O(1)操作,因为它使用对象的哈希码作为关键字,这为您提供了更快的搜索能力。

我不认为浏览一个包含一百万个条目的列表来找到几个条目是个好主意。

例如,是否可以将这些上百万个实体保存到RDBMS中,并在该数据库上执行查询?

如果这是不可能的,那么我会使用字典,无论如何,如果你想做关键字查找。

票数 32
EN

Stack Overflow用户

发布于 2009-05-05 08:25:09

字典并没有那么糟糕,因为字典中的键被设计为可以快速找到。为了在列表中找到一个数字,它需要遍历整个列表。

当然,只有当你的数字是唯一的并且没有排序的时候,字典才能工作。

我认为在.NET 3.5中也有一个HashSet<T>类,它也只允许唯一的元素。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/823860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档