我有一个很大的整数列表,发送到我的webservice。我们的业务规则规定这些值必须是唯一的。什么是最有效的方法来确定是否有任何重复?我不需要知道这些值,我只需要知道其中两个值是否相等。
起初我在考虑使用整数通用列表和list.Exists()方法,但这是O(n);
然后我考虑使用Dictionary和ContainsKey方法。但是,我只需要键,我不需要值。而且我认为这也是线性搜索。
是否有更好的数据类型可用于查找列表中的唯一性?还是我坚持使用线性搜索?
答案 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)一样好,但代码更少,而且仍然易于阅读。