Czy jest to możliwe, a jeśli tak, to w jaki sposób przesłonię metodę Contains
normalnie , gdzie T
jest moim własnym, niestandardowym typem?Zastąp ogólną listę .NET <MyType> .Contains (MyTypeInstance)?
Odpowiedz
Aby tworzyć własne Zawiera wdrażania można utworzyć klasę, która implementuje IList interfejs. W ten sposób twoja klasa będzie wyglądać jak ilist. Możesz mieć prawdziwą Listę wewnętrznie, aby robić standardowe rzeczy.
class MyTypeList : IList<MyType>
{
private List<MyType> internalList = new ...;
public bool Contains(MyType instance)
{
}
....
}
Musisz zastąpić Equals
i GetHashCode
w swojej klasie (MyType
).
Jeśli realizacji równych z was niestandardowy typ, contains funkcją Lista będzie działać
Nie, lista
Nie sądzę jednak, żeby zasłużył na awans. Równe jest prawdziwe; naprawiono (+1) –
List<T>
wykorzystuje EqualityComparer<T>.Default
robić porównań; to sprawdza najpierw, czy twój obiekt implementuje IEquatable<T>
; w przeciwnym razie używa object.Equals
.
Tak; najłatwiej jest zastąpić Equals
(zawsze aktualizuj GetHashCode
, aby dopasować logikę do Equals
). Alternatywnie, użyj LINQ zamiast:
bool hasValue = list.Any(x => x.Foo == someValue);
@Marc Gravell: więc jeśli chcę przetestować "równość" 2 niestandardowych klas, które zawierają tylko właściwości i pola, muszę wdrożyć IEquatable w mojej klasie? Musiałam być bardzo zmęczona, gdy założyłam, że 2 klasy będą uważane za "równe" tylko dlatego, że pola zawierają te same wartości w każdej klasie. :/... dzięki za cynk;) – IAbstract
@Marc Gravell: cóż, technicznie rzecz biorąc, nie ma znaczenia, co zawierają. Ważne jest to, że poprawnie implementuję IEquatable
@dboarman - dokładnie. I ponownie twoja pierwsza uwaga, struktury IIRC * nie * zachowują się w ten sposób, więc nie byłeś milion mil. –
zależności od specyficznych potrzeb masz w ręcznym można użyć wyrażenia Linq za to, że:
list.Any(x => x.Name.Equals("asdas", .....)) // whatever comparison you need
Następnie można zawinąć go w metodę rozszerzenia dla wygody .
Jest nieco niejasne z twojego pytania, co musisz osiągnąć. Czy potrzebujesz a) standardowego Contains do pracy ze swoim niestandardowym typem lub b) do jakiejś specjalnej logiki, gdy wywoływana jest Contains? –
Peter, w zasadzie lista, którą mam, nie jest w pamięci w czasie wykonywania, jest luźno/słabo odniesiona do OODBMS. Jeśli zrobię natywną .net .Contains na liście, pobiera ona całą listę z backendu oodbms i ocenia lokalnie. Dlatego chciałem nadpisać go za pomocą właściwej (backendowej) składni zapytania. –
@ Jörg - mając to na uwadze, w jaki sposób przesłanianie Equals/GetHashCode rozwiązuje twój problem (odpowiedź @Cans)? –