2010-12-01 129 views
2

我有一个C#集合中没有实现IEquatable或IComparable的对象。我想检查集合是否包含重复的对象。即我想知道Object.ReferenceEquals(x,y)对于我的列表中的任何x和y是否为false。如何验证集合是否包含所有唯一对象

我该如何有效地做到这一点?

这对C#和LINQ方法都很好。

+2

LINQ是C#的一部分,你知道;) – 2010-12-01 11:52:54

+0

好吧,一个纯粹的非LINQ .NET解决方案和一个LINQ解决方案,然后:-) – Holstebroe 2010-12-01 14:51:17

回答

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(); 
+0

LINQ表达式不起作用。独特需要IComparables。 – Holstebroe 2010-12-01 14:47:04

2

我会建议你使用

collection.GroupBy(x=>x).Any(x=>x.Count() != 1) 

利润是:通过收集迭代将尽快停止,因为第一个重复的对象会被发现。

相关问题