我有一个C#的对象集合,它们没有实现IEquatable或IComparable。我想检查集合是否包含重复的对象。即我想知道我的列表中的任何x和y的Object.ReferenceEquals(x,y)是否为false。
我如何有效地做到这一点?
使用C#和LINQ方法会很好。
答案 0 :(得分:6)
非LINQ,当您的集合实现ICollection<T>
或ICollection
时:
bool allItemsUnique =
new HashSet<YourType>(yourCollection).Count == yourCollection.Count;
非LINQ,当您的收藏集未实现ICollection<T>
或ICollection
时。 (此版本的理论性能略优于第一版,因为一旦找到重复版本,它就会提前爆发。)
bool allItemsUnique = true;
var tempSet = new HashSet<YourType>();
foreach (YourType obj in yourCollection)
{
if (!tempSet.Add(obj))
{
allItemsUnique = false;
break;
}
}
LINQ。 (此版本的最佳案例性能 - 当您的集合实现ICollection<T>
或ICollection
时 - 将与第一个非LINQ解决方案大致相同。如果您的集合未实现ICollection<T>
或ICollection
然后LINQ版本的效率会降低。)
bool allItemsUnique =
yourCollection.Distinct().Count() == yourCollection.Count();
答案 1 :(得分:4)
我建议你使用
collection.GroupBy(x=>x).Any(x=>x.Count() != 1)
利润是:迭代收集将很快停止,因为将找到第一个复制对象。