我有一個C#集合中沒有實現IEquatable或IComparable的對象。我想檢查集合是否包含重複的對象。即我想知道Object.ReferenceEquals(x,y)對於我的列表中的任何x和y是否爲false。如何驗證集合是否包含所有唯一對象
我該如何有效地做到這一點?
這對C#和LINQ方法都很好。
我有一個C#集合中沒有實現IEquatable或IComparable的對象。我想檢查集合是否包含重複的對象。即我想知道Object.ReferenceEquals(x,y)對於我的列表中的任何x和y是否爲false。如何驗證集合是否包含所有唯一對象
我該如何有效地做到這一點?
這對C#和LINQ方法都很好。
非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();
LINQ表達式不起作用。獨特需要IComparables。 – Holstebroe 2010-12-01 14:47:04
我會建議你使用
collection.GroupBy(x=>x).Any(x=>x.Count() != 1)
利潤是:通過收集迭代將盡快停止,因爲第一個重複的對象會被發現。
LINQ是C#的一部分,你知道;) – 2010-12-01 11:52:54
好吧,一個純粹的非LINQ .NET解決方案和一個LINQ解決方案,然後:-) – Holstebroe 2010-12-01 14:51:17