testing列表中的所有值是否唯一

我有一个小字节的列表,我想testing它们是不同的值。 例如,我有这样的:

List<byte> theList = new List<byte> { 1,4,3,6,1 }; 

检查所有值是否有区别的最好方法是什么?

 bool isUnique = theList.Distinct().Count() == theList.Count(); 

这是另一种比Enumerable.Distinct + Enumerable.Count更有效的方法(如果序列不是集合types,则更多)。 它使用了一个消除重复的HashSet<T> ,在查找中非常高效并且具有count属性:

 var distinctBytes = new HashSet<byte>(theList); bool allDifferent = distinctBytes.Count == theList.Count; 

或另一个 – 更微妙和有效的方法:

 var diffChecker = new HashSet<byte>(); bool allDifferent = theList.All(diffChecker.Add); 

HashSet<T>.Add由于已经在HashSet而不能被添加,所以返回falseEnumerable.All停在第一个“false”。

好的,这里是使用标准的.Net可以想到的最有效的方法

 public static class Extension { public static bool HasDuplicate<T>( this IEnumerable<T> source, out T firstDuplicate) { if (sequence == null) { throw ArgumentNullException(nameof(source)); } var checkBuffer = new HashSet<T>(); foreach(firstDuplicate in source) { if (!checkBuffer.Add(firstDuplicate)) { return true; } } firstDuplicate = default(T); return false; } } 

本质上,如果你想要做的是find第一个重复,那么枚举整个序列两次的意义重大。

我可以通过特殊的空白和单个元素序列来优化这个,但是这样做会使可读性/可维护性贬值,收益甚微。

有很多解决scheme。

毫无疑问,用LINQ作为“juergen d”和“Tim Schmelter”提到的更漂亮。

但是,如果你只有“复杂性”和速度,最好的解决办法就是自己来实现它。 其中一个解决scheme是创build一个N大小的数组(字节为256)。 并循环数组,并在每次迭代将testing匹配的数字索引如果值为1,如果它,这意味着我已经增加数组索引,因此该数组是不明显的,否则我将增加数组单元格,并继续检查。

另一个解决scheme,如果你想find重复的值。

 var values = new [] { 9, 7, 2, 6, 7, 3, 8, 2 }; var sorted = values.ToList(); sorted.Sort(); for (var index = 1; index < sorted.Count; index++) { var previous = sorted[index - 1]; var current = sorted[index]; if (current == previous) Console.WriteLine(string.Format("duplicated value: {0}", current)); } 

输出:

 duplicated value: 2 duplicated value: 7 

http://rextester.com/SIDG48202