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.
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.
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.
Jaki jest typ MyObject? Czy ma właściwie overriden Equals() metoda?
Jest to obiekt zdefiniowany przez użytkownika i ma tylko 3 właściwości, 2 ciągi i 1 liczbę całkowitą. – Tony
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(). –
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.
Nie trzeba być tą samą instancją, jeśli klasa nadpisuje metodę Equals, a ta ostatnia zwraca wartość true – PierrOz
Musisz pokazać nam kod metody Contains. – Timores
@Timores: Contains() jest metodą na liście. –