2009-04-08 9 views
7

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

+0

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? –

+0

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. –

+0

@ Jörg - mając to na uwadze, w jaki sposób przesłanianie Equals/GetHashCode rozwiązuje twój problem (odpowiedź @Cans)? –

Odpowiedz

5

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

    } 

    .... 
} 
2

Musisz zastąpić Equals i GetHashCode w swojej klasie (MyType).

0

Jeśli realizacji równych z was niestandardowy typ, contains funkcją Lista będzie działać

+0

Nie, lista nigdy nie użyje operatora ==; tylko równa się –

+0

Nie sądzę jednak, żeby zasłużył na awans. Równe jest prawdziwe; naprawiono (+1) –

7

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

@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

+0

@Marc Gravell: cóż, technicznie rzecz biorąc, nie ma znaczenia, co zawierają. Ważne jest to, że poprawnie implementuję IEquatable i wybieram pole, które powinno dyktować, czy inna MyClass jest uważana za równą. – IAbstract

+0

@dboarman - dokładnie. I ponownie twoja pierwsza uwaga, struktury IIRC * nie * zachowują się w ten sposób, więc nie byłeś milion mil. –

1

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 .