2009-08-21 16 views
0

我有一个大的列表发送到我的web服务的整数。我们的业务规则声明这些值必须是唯一的。找出是否存在重复的最高性能方法是什么?我不需要知道值,我只需要知道两个值是否相等。起初我在考虑使用通用整数列表和list.Exists()方法,但这是O(n);用整数集合检查存在的最高性能方法是什么?

然后我在考虑使用Dictionary和ContainsKey方法。但是,我只需要Keys,我不需要这些值。我认为这也是一种线性搜索。

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

回答

15

使用HashSet<T>

的HashSet的类提供高 表现的一组操作。一组是 集合,不包含重复 元素,且其元素没有 特定的顺序

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

+4

当inputList.Count!= hashSet.Count,“休斯顿,我们有重复!” – user7116 2009-08-21 20:34:43

+0

哪个还是O(n),我认为他能得到的最好。 – Marc 2009-08-21 20:35:10

+0

@sixlettervariables - 优点! – 2009-08-21 20:35:21

1

听起来像一个Hashset工作...

0

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

否则最好的选择是Dictionary。每件物品的价值都将被浪费,但这会给你带来最好的表现。

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

0

如果这组数字是稀疏的,那么其他人建议使用HashSet。

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

0

关于做什么:

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

我想知道的这个性能。我认为它会和O(n)一样好,但代码少,易读。

相关问题