2009-04-08 12 views
7

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

+0

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

+0

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

+0

@ Jörg - also wie bezweckt das Überschreiben von Equals/GetHashCode dein Problem (@Cans antwort)? –

Antwort

5

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

    } 

    .... 
} 
2

Sie müssen Equals und GetHashCode in Ihrer Klasse überschreiben (MyType).

0

Wenn Sie die Gleichen von Ihnen benutzerdefinierten Typ implementieren, enthält die Funktion der Liste

+0

Nein, die Liste wird niemals den Operator == verwenden; nur gleich –

+0

Glauben Sie nicht, dass es einen Downvote verdient hätte. Das Gleiche ist wahr; (+1) –

7

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

@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

+0

@Marc Gravell: naja, technisch wäre es egal was sie beinhalten. Was wichtig ist, ist, dass ich IEquatable 'richtig' implementiere und das Feld auswähle, das bestimmen soll, ob eine andere MyClass als gleich angesehen wird. – IAbstract

+0

@dboarman - genau. Und zu Ihrem ersten Punkt, IIRC-Strukturen verhalten sich so, also waren Sie keine Million Meilen entfernt. –

1

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 .

Verwandte Themen