2009-04-08 19 views
7

È possibile, e in caso affermativo come faccio a sovrascrivere il metodo Contains di un normale List<T>, dove T è il mio tipo personalizzato?Override. NET Elenco generico <MyType> .Contains (MyTypeInstance)?

+0

È poco chiaro dalla domanda che cosa è necessario ottenere. A) hai bisogno dello standard Contains per lavorare con il tuo tipo personalizzato o b) fai qualche logica speciale quando viene chiamato Contiene? –

+0

Peter, in pratica l'elenco che sto avendo non è in-memory in fase di esecuzione, è debolmente/deferito a un OODBMS. Se faccio un nativo .net. Contiene sull'Elenco recupera l'intera lista dal backend degli oodbms e valuta localmente. Quindi ho voluto sovrascriverlo con la corretta sintassi della query (backend) .. –

+0

@ Jörg - quindi, tenendo presente questo, come fa l'override di Equals/GetHashCode a risolvere il tuo problema (risposta @Cans)? –

risposta

5

Per rendere il proprio Contiene implementazione si potrebbe creare una classe che implementa l'interfaccia IList. In questo modo la tua classe sembrerà un IList. Potresti avere una vera lista internamente per fare le cose standard.

class MyTypeList : IList<MyType> 
{ 
    private List<MyType> internalList = new ...; 

    public bool Contains(MyType instance) 
    { 

    } 

    .... 
} 
2

È necessario eseguire l'override di Equals e GetHashCode nella classe (MyType).

0

Se si implementa l'uguale di voi tipo personalizzato, il contiene funzione della lista lavorerà

+0

No, l'elenco non utilizzerà mai l'operatore ==; solo uguale a –

+0

Non penso che meritasse un downvote, però. The Equals è vero; corretto quello (+1) –

7

List<T> utilizza EqualityComparer<T>.Default fare paragoni; questo controlla prima di vedere se il tuo oggetto implementa IEquatable<T>; altrimenti viene utilizzato object.Equals.

Quindi; la cosa più semplice da fare è ignorare Equals (aggiornare sempre GetHashCode in modo che corrisponda alla logica in Equals). In alternativa, utilizzare LINQ invece:

bool hasValue = list.Any(x => x.Foo == someValue); 
+0

@Marc Gravell: quindi se voglio testare l''uguaglianza' di 2 classi personalizzate che contengono solo proprietà e campi, devo implementare IEquatable nella mia classe? Devo essere stato davvero stanco quando ho fatto l'ipotesi che 2 classi sarebbero state considerate 'uguali' solo perché i campi contenevano gli stessi valori in ogni classe. :/... grazie per il suggerimento;) – IAbstract

+0

@Marc Gravell: beh, tecnicamente, non importa ciò che contengono. Ciò che è importante è che io 'correttamente' implementare IEquatable e selezionare il campo che dovrebbe dettare se un altro MyClass è considerato uguale. – IAbstract

+0

@dboarman - esattamente. E il tuo primo punto, le strutture IIRC * si comportano così, quindi non eri a milioni di miglia di distanza. –

1

A seconda di cosa esigenze specifiche che hai nel tuo sostituzione si potrebbe utilizzare l'espressione LINQ per farlo:

list.Any(x => x.Name.Equals("asdas", .....)) // whatever comparison you need 

si può poi avvolgerla in un metodo di estensione per convenienza .