È 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)?
risposta
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)
{
}
....
}
È necessario eseguire l'override di Equals
e GetHashCode
nella classe (MyType
).
Se si implementa l'uguale di voi tipo personalizzato, il contiene funzione della lista lavorerà
No, l'elenco
Non penso che meritasse un downvote, però. The Equals è vero; corretto quello (+1) –
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);
@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
@Marc Gravell: beh, tecnicamente, non importa ciò che contengono. Ciò che è importante è che io 'correttamente' implementare IEquatable
@dboarman - esattamente. E il tuo primo punto, le strutture IIRC * si comportano così, quindi non eri a milioni di miglia di distanza. –
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 .
- 1. Elenco <? estende MyType>
- 2. metodo generico Scala override
- 3. Converti Elenco generico .NET nell'elenco F #
- 4. ritorno sconosciuto Elenco generico <T>
- 5. Override tipo restituito generico dall'interfaccia
- 6. .Contains() metodo che non chiama Override uguale al metodo
- 7. Elenco/dizionario generico
- 8. è-operatore elenco generico
- 9. override un metodo generico per un generico in Java
- 10. rimozione di articoli da un elenco generico <t>
- 11. .net XmlSerializer sulle proprietà override
- 12. Come fare un elenco generico uguale un altro elenco generico
- 13. Array di elenco generico
- 14. Utilizzo del dizionario <Foo, Foo> Invece di Elenco <Foo> per accelerare le chiamate a Contains()
- 15. Quali strutture dati in .NET fanno O (1) sulle chiamate Contains()?
- 16. come .Contains in jQuery
- 17. C# Elenco <> Ordina con 3 proprietà .Net 2.0
- 18. C# elenco generico <T> come ottenere il tipo di T?
- 19. Utilizzo di .Contains() su una proprietà in un elenco
- 20. C# array vs elenco generico
- 21. unmarshalling elenco generico con JAXB
- 22. Elenco generico di oggetti generici
- 23. Siate certi - elenco generico deserializzazione
- 24. Elenco generico per stringa CSV
- 25. elenco generico semplice in java
- 26. Converti DataTable in Elenco generico?
- 27. Elenco generico FindAll() vs. foreach
- 28. override ToString() della Lista <MyClass>
- 29. Java: .contains and .equals
- 30. Determinare se la proprietà è elenco generico <of T> tramite elementi di riflessione e di elenco ciclo
È 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? –
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) .. –
@ Jörg - quindi, tenendo presente questo, come fa l'override di Equals/GetHashCode a risolvere il tuo problema (risposta @Cans)? –