Ist es möglich, und wenn ja, wie überschreibe ich die Contains
Methode eines ansonsten normalen List<T>
, wobei T
mein eigener, benutzerdefinierter Typ ist?Override .NET Generic List <MyType>. Enthält (MyTypeInstance)?
Antwort
arbeiten, um Ihre eigene Enthält Implementierung machen Sie eine Klasse erstellen können, die die IList-Schnittstelle implementiert. So wird Ihre Klasse wie eine IList aussehen. Du könntest intern eine echte Liste haben, um die Standard-Sachen zu machen.
class MyTypeList : IList<MyType>
{
private List<MyType> internalList = new ...;
public bool Contains(MyType instance)
{
}
....
}
Sie müssen Equals
und GetHashCode
in Ihrer Klasse überschreiben (MyType
).
Wenn Sie die Gleichen von Ihnen benutzerdefinierten Typ implementieren, enthält die Funktion der Liste
Nein, die Liste
Glauben Sie nicht, dass es einen Downvote verdient hätte. Das Gleiche ist wahr; (+1) –
List<T>
verwendet EqualityComparer<T>.Default
Vergleiche zu tun; Dies prüft zuerst, ob Ihr Objekt implementiert IEquatable<T>
; Ansonsten wird object.Equals
verwendet.
Also; Am einfachsten ist es, Equals
zu überschreiben (immer GetHashCode
aktualisieren, um der Logik in Equals
zu entsprechen). Alternativ können Sie LINQ statt:
bool hasValue = list.Any(x => x.Foo == someValue);
@Marc Gravell: Wenn ich die 'Gleichheit' von 2 benutzerdefinierten Klassen testen möchte, die nur Eigenschaften und Felder enthalten, muss ich IEquatable in meiner Klasse implementieren? Ich muss wirklich müde gewesen sein, als ich die Annahme machte, dass 2 Klassen als "gleich" betrachtet würden, nur weil die Felder in jeder Klasse dieselben Werte enthielten. :/... danke für den Tipp;) – IAbstract
@Marc Gravell: naja, technisch wäre es egal was sie beinhalten. Was wichtig ist, ist, dass ich IEquatable
@dboarman - genau. Und zu Ihrem ersten Punkt, IIRC-Strukturen verhalten sich so, also waren Sie keine Million Meilen entfernt. –
Je nachdem, welche Bedürfnisse Sie in der Überschreibung haben könnten Sie Linq Ausdruck verwenden, dass zu tun:
list.Any(x => x.Name.Equals("asdas", .....)) // whatever comparison you need
Sie können dann wickeln Sie es in eine Erweiterungsmethode für Bequemlichkeit .
- 1. C#: Generic List Eigenschaft
- 2. .NET Casting Generic Liste
- 3. . NET Generic List <T> Problem, arbeitet nach Design, muss funktionieren. Mehrwert statt Referenz
- 4. Mit List <>. Enthält() mit unterschiedlicher Art
- 5. Wählen Sie unten N von Generic List
- 6. Generic Syntax Symbol <~>
- 7. Generic SQL Builder .NET
- 8. Generic ThreadPool in. NET
- 9. Generic .Net Producer/Consumer
- 10. Binding Generic List Array zu GridView
- 11. C# Bind Generic List zu Textbox WinForms?
- 12. Suche Element in List <>, die einen Wert enthält
- 13. .NET EventHandlers - Generic oder nicht?
- 14. .NET Mitgliedschaft Login ReturnUrl Override
- 15. C# Array Element verschieben (nicht Arraylist/Generic List)
- 16. Verwendung von NET Generic List ToArray in einem COM Called Wrapper verursacht Zugriffsverletzung, fehlt mir etwas?
- 17. Unterschied zwischen Liste <string> lst = new List() und List <> lst = new List()
- 18. enthält .NET 4.5. NET 4.0
- 19. List <> eigene comparer
- 20. Vereinbaren List <> aufsteigend
- 21. ReliableDictionary <key, List>
- 22. Wie kann ich Generic List in HttpCookie in C# speichern?
- 23. Entity Framework-Datenbank zuerst - Map to Generic List
- 24. C# List Generische Erweiterung Methode vs Non-Generic
- 25. C# DataGridView Sortierung mit Generic List als zugrunde liegende Quelle
- 26. Generic Icollection Von <T>
- 27. Wie schreibt List <> in Paket
- 28. Mit Hangfire: generic Enqueue <T> Methode löst Ausnahme
- 29. Enthält .NET 4.0 .NET 2.0 nicht?
- 30. Override ListBoxItem-Hintergrundfarbe, wenn nicht im Fokus (.NET 4.5)
Es ist ein wenig unklar von Ihrer Frage, was Sie erreichen müssen. Brauchen Sie a) den Standard Contains, um mit Ihrem benutzerdefinierten Typ zu arbeiten, oder b) eine spezielle Logik, wenn Contains aufgerufen wird? –
Peter, im Grunde die Liste Ich habe keine In-Memory zur Laufzeit, es ist lose/schwach-Bezug zu einem OODBMS. Wenn ich eine native .net. Enthält auf der Liste, ruft es die gesamte Liste aus dem oodbms-Backend und wertet lokal. Deshalb wollte ich es mit der richtigen (Backend-) Abfragesyntax überschreiben. –
@ Jörg - also wie bezweckt das Überschreiben von Equals/GetHashCode dein Problem (@Cans antwort)? –