2010-12-01 13 views
2

J'ai une collection C# d'objets qui n'implémentent pas ICquatable ou IComparable. Je veux vérifier si la collection contient des objets en double. C'est à dire. Je veux savoir si Object.ReferenceEquals (x, y) est faux pour tout x et y dans ma liste.Comment valider si une collection contient tous les objets uniques

Comment le ferais-je efficacement?

Ce serait bien avec une méthode C# et une méthode LINQ.

+2

LINQ fait partie de C# vous connaissez;) –

+0

Ok, une pure solution non-LINQ .NET et une solution LINQ alors :-) – Holstebroe

Répondre

6

non-LINQ, lorsque votre collection implémente ICollection<T> ou ICollection:

bool allItemsUnique = 
    new HashSet<YourType>(yourCollection).Count == yourCollection.Count; 

non-LINQ, lorsque votre collection ne met pas en œuvre ICollection<T> ou ICollection. (Cette version dispose d'une performance légèrement meilleure théorique que la première car elle éclatera tôt dès qu'un double se trouve.)

bool allItemsUnique = true; 

var tempSet = new HashSet<YourType>(); 
foreach (YourType obj in yourCollection) 
{ 
    if (!tempSet.Add(obj)) 
    { 
     allItemsUnique = false; 
     break; 
    } 
} 

LINQ. (La meilleure performance de cette version - lorsque votre collection implémente ICollection<T> ou ICollection - sera à peu près la même que la première solution non-LINQ Si votre collection n'implémente pas ICollection<T> ou ICollection alors la version LINQ sera moins efficace.)

bool allItemsUnique = 
    yourCollection.Distinct().Count() == yourCollection.Count(); 
+0

L'expression LINQ ne fonctionnera pas. Distinct veut IComparables. – Holstebroe

+0

Le HashSet s'attend également à IComparable, donc aucune méthode ne fonctionnera. – Holstebroe

+0

@Holstebroe: Ils ne nécessitent pas 'IComparable'. Je viens de tester les deux versions en utilisant une collection 'object' simple et ils ont tous deux bien fonctionné. – LukeH

2

Je vous suggère d'utiliser

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

Profit est: itérer collection arrêterait dès, comme premier objet en double serait trouvée.

+0

GroupBy attend IComparable que mes objets n'implémentent pas. – Holstebroe