2010-03-31 8 views
5

Używam Contains() do identyfikowania czegoś, które NIE zawiera się na liście. Więc coś,! Contains() obiektu List nie działa

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

ale cała if idzie prawdziwe mimo MyObject jest już na liście.

+0

Musisz pokazać nam kod metody Contains. – Timores

+1

@Timores: Contains() jest metodą na liście . –

Odpowiedz

3

Jeśli nie masz możliwości nadpisania wartości równych (lub jeśli nie chcesz), możesz zaimplementować obiekt IEqualityComparer<T> i przekazać go jako drugi parametr metody Contains (przeciążenie). Jeśli twój obiekt jest typem odniesienia, to w przeciwnym razie po prostu porównywałby odniesienia zamiast zawartości obiektu.

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); 

W tym scenariuszu foo2 nie zostanie dodana do listy. Byłoby bez argumentu porównywalnego.

9

Jaki jest typ MyObject? Czy ma właściwie overriden Equals() metoda?

+0

Jest to obiekt zdefiniowany przez użytkownika i ma tylko 3 właściwości, 2 ciągi i 1 liczbę całkowitą. – Tony

+0

Od MSDN: "Domyślna implementacja równań obsługuje równość referencji dla typów odniesienia [...] Równość odniesienia oznacza porównywane odniesienia do obiektów, odnoszące się do tego samego obiektu." Contains() używa domyślnego porównywania równości, który z kolei wywołuje Equals() (chyba że twoja klasa implementuje IEquatable, ale to nie ma znaczenia). Nie oczekuj więc, że Contains() będzie miało przyzwoite zachowanie, jeśli nie zastąpisz Equals(). –

1

Jeśli testujesz w celu znalezienia obiektu w List<T>, to parametrem w metodzie Contains() musi być to samo wystąpienie jako jedno z listy. Nie zadziała, jeśli będą to dwa oddzielne, ale identyczne przypadki.

+1

Nie trzeba być tą samą instancją, jeśli klasa nadpisuje metodę Equals, a ta ostatnia zwraca wartość true – PierrOz

Powiązane problemy