使用整数集合检查存在性能最高的方法是什么?

时间:2009-08-21 20:26:55

标签: c# .net generics types unique

我有一个很大的整数列表,发送到我的webservice。我们的业务规则规定这些值必须是唯一的。什么是最有效的方法来确定是否有任何重复?我不需要知道这些值,我只需要知道其中两个值是否相等。

起初我在考虑使用整数通用列表和list.Exists()方法,但这是O(n);

然后我考虑使用Dictionary和ContainsKey方法。但是,我只需要键,我不需要值。而且我认为这也是线性搜索。

是否有更好的数据类型可用于查找列表中的唯一性?还是我坚持使用线性搜索?

5 个答案:

答案 0 :(得分:15)

使用HashSet<T>

  

HashSet类提供高   绩效集合运作。一套是一个   不包含重复的集合   元素,其元素为no   特别订单

HashSet<T>甚至公开a constructor that accepts an IEnumerable<T>。通过将List<T>传递给HashSet<T>'s构造函数,您最终会引用一个新的HashSet<T>,其中包含原始List<T>中不同的项目序列。

答案 1 :(得分:1)

听起来像Hashset ...

的工作

答案 2 :(得分:0)

如果您使用的是框架3.5,则可以使用HashSet集合。

否则最好的选择是Dictionary。每个项目的价值都将被浪费,但这将为您提供最佳表现。

如果在将项目添加到HashSet / Dictionary时检查重复项而不是之后对它们进行计数,则在出现重复项时,您会获得比O(n)更好的性能,因为您不必继续查找第一个副本。

答案 3 :(得分:0)

如果数字集稀疏,那么其他人建议使用HashSet。

但是如果这组数字大部分都是偶然的间隙,那么如果将数字集存储为开始,结束对的排序数组或二叉树,那将会好很多。然后,您可以搜索以查找具有小于搜索关键字的最大开始值的对,并与该对的结束值进行比较,以查看它是否存在于集合中。

答案 4 :(得分:0)

做什么:

list.Distinct().Count() != list.Count() 

我想知道这个的表现。我认为它会和O(n)一样好,但代码更少,而且仍然易于阅读。