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
而不能被添加,所以返回false
。 Enumerable.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