我有一个小的字节列表,我想测试它们都是不同的值。 例如,我有这个:
List<byte> theList = new List<byte> { 1,4,3,6,1 };
检查所有值是否相同的最佳方法是什么?
答案 0 :(得分:132)
bool isUnique = theList.Distinct().Count() == theList.Count();
答案 1 :(得分:57)
这是另一种方法,它比Enumerable.Distinct
+ Enumerable.Count
更有效(如果序列不是集合类型,则更是如此)。它使用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
会返回false
,因为它已经在HashSet
中。 Enumerable.All
停在第一个“假”上。
答案 2 :(得分:5)
好的,这是我能想到的使用标准.Net
的最有效方法using System;
using System.Collections.Generic;
public static class Extension
{
public static bool HasDuplicate<T>(
this IEnumerable<T> source,
out T firstDuplicate)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source));
}
var checkBuffer = new HashSet<T>();
foreach (var t in source)
{
if (checkBuffer.Add(t))
{
continue;
}
firstDuplicate = t;
return true;
}
firstDuplicate = default(T);
return false;
}
}
基本上,如果您想要做的就是找到第一个副本,那么两次枚举整个序列的重点是什么。
我可以通过特殊的套管空单元素序列来优化这一点,但这样会因可读性/可维护性而以最小的增益降低。
答案 3 :(得分:1)
还可以:使用哈希集
var uniqueIds = new HashSet<long>(originalList.Select(item => item.Id));
if (uniqueIds.Count != originalList.Count)
{
}
答案 4 :(得分:0)
有很多解决方案。
毫无疑问,使用LINQ作为“juergen d”和“Tim Schmelter”提到的更美丽。
但是,如果你没有“复杂性”和速度,最好的解决方案就是自己实现它。 其中一个解决方案是创建一个N大小的数组(对于字节为256)。 并循环数组,并在每次迭代时将测试匹配数字索引,如果值为1,如果它,这意味着我已经增加数组索引,因此数组不明显,否则我将增加数组单元格并继续检查
答案 5 :(得分:0)
另一种解决方案,如果你想找到重复的值。
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
答案 6 :(得分:0)
使用Distinct
与GroupBy
类似的逻辑:
var isUnique = theList.GroupBy(i => i).Count() == theList.Count;
答案 7 :(得分:0)
我检查IEnumerable(aray,list等)是否是唯一的:
var isUnique = someObjectsEnum.GroupBy(o => o.SomeProperty).Max(g => g.Count()) == 1;