2010-12-01 74 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) 

利潤是:通過收集迭代將盡快停止,因爲第一個重複的對象會被發現。

相關問題