2010-03-31 7 views
5

J'utilise Contains() pour identifier quelque chose qui ne figure pas dans la liste. Donc, quelque chose comme,! Contains() de l'objet Liste ne fonctionne pas

if(!list.Contains(MyObject)) 
{ 
//do something 
} 

mais, toute instruction if va à vrai même si MyObject est déjà dans la liste.

+0

Vous devez nous montrer le code de la méthode Contient. – Timores

+1

@Timores: Contains() est une méthode de la liste . –

Répondre

3

Si vous ne pouvez pas remplacer Equals (ou si vous ne le souhaitez pas), vous pouvez implémenter un objet IEqualityComparer<T> de votre objet et le transmettre en tant que deuxième paramètre à la méthode Contient (surcharge). Si votre objet est un type de référence, il suffirait simplement de comparer des références au lieu du contenu de l'objet.

class Foo 
{ 
    public string Blah { get; set; } 
} 

class FooComparer : IEqualityComparer<Foo> 
{ 
    #region IEqualityComparer<Foo> Members 

    public bool Equals(Foo x, Foo y) 
    { 
     return x.Blah.Equals(y.Blah); 
    } 

    public int GetHashCode(Foo obj) 
    { 
     return obj.Blah.GetHashCode(); 
    } 

    #endregion 
} 

...

Foo foo = new Foo() { Blah = "Apple" }; 
Foo foo2 = new Foo() { Blah = "Apple" }; 

List<Foo> foos = new List<Foo>(); 

foos.Add(foo); 
if (!foos.Contains(foo2, new FooComparer())) 
    foos.Add(foo2); 

Dans ce scénario, foo2 ne serait pas ajouté à la liste. Ce serait sans l'argument de la clé.

9

Quel est le type de MyObject? A-t-il une méthode Equals() correctement remplacée?

+0

C'est un objet défini par l'utilisateur et n'a que 3 propriétés, 2 chaînes et 1 entier. – Tony

+0

De MSDN: "L'implémentation par défaut de Equals prend en charge l'égalité de référence pour les types de référence [...]. L'égalité de référence signifie que les références d'objet qui sont comparées font référence au même objet." Contient() utilise le comparateur d'égalité par défaut, qui à son tour appelle Equals() (sauf si votre classe implémente IEquatable, mais c'est à côté du point). Donc, ne vous attendez pas à ce que Contains() ait un comportement correct si vous n'avez pas écrasé Equals(). –

1

Si vous testez pour trouver un objet dans List<T>, le paramètre dans la méthode Contient() doit être le même instance que celui de la liste. Cela ne fonctionnera pas s'il s'agit de deux instances distinctes mais identiques.

+1

Pas besoin d'être la même instance si la classe remplace la méthode Equals et cette dernière renvoie true – PierrOz

Questions connexes