我有一个很小的字节列表,我想测试它们是否都是不同的值。例如,我有这样的例子:
List<byte> theList = new List<byte> { 1,4,3,6,1 };
检查是否所有值都是不同的最好方法是什么?
发布于 2013-08-19 05:36:55
bool isUnique = theList.Distinct().Count() == theList.Count();
发布于 2013-08-19 05:59:44
这是另一种比Enumerable.Distinct
+ Enumerable.Count
更有效的方法(如果序列不是集合类型,则效率更高)。它使用HashSet<T>
来消除重复,在查找中非常高效,并且具有计数属性:
var distinctBytes = new HashSet<byte>(theList);
bool allDifferent = distinctBytes.Count == theList.Count;
或者是另一种更微妙、更有效的方法:
var diffChecker = new HashSet<byte>();
bool allDifferent = theList.All(diffChecker.Add);
如果元素已经存在于HashSet
中而无法添加,则HashSet.Add
返回false
。Enumerable.All
在第一个"false“处停止。
发布于 2017-02-02 19:59:00
好的,这是我能想到的使用标准.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;
}
}
从本质上讲,如果您所要做的只是找到第一个副本,那么枚举整个序列两次有什么意义。
我可以通过特殊的格式化空的和单元素的序列来优化这一点,但这会降低可读性/可维护性,并带来最小的收益。
https://stackoverflow.com/questions/18303897
复制相似问题