2016-05-11 10 views
0

oft verwende ich LINQ zum Abfragen, Ändern und Verwalten von Listen (oder Wörterbücher) meiner benutzerdefinierten Klassen.Benutzerdefinierte Klasse: Schnittstelle zu implementieren, um ordnungsgemäß mit LINQ zu arbeiten

Es ist passiert, dass, zum Beispiel, Contains-Methode gab mir seltsame Ergebnisse, und schließlich habe ich herausgefunden, dass IEquatable Schnittstelle ordnungsgemäß implementiert werden verstehen, dass das Objekt tatsächlich in der Liste war.

Haben Sie praktisch eine Liste der Schnittstelle, die meine Klassen implementieren sollten, um mit allen typischen LINQ-Konstrukt (wie Discinct, enthält, außer usw.) gut zu funktionieren?

Danke!

Antwort

2

Sie können die Equals Methode auf Ihrer Klasse überschreiben. Wenn Sie nicht Equals dann Distinct und Contains (etc) Sie außer Kraft setzen werden überprüfen, ob zwei Elemente tatsächlich beide Referenzen auf das gleiche Objekt sind. Wahrscheinlich möchten Sie, dass zwei verschiedene Objekte mit denselben Eigenschaften erkannt werden.

Eine weitere Option besteht darin, eine weitere Klasse zu erstellen, die IEqualityComparer<T> implementiert, und diese Klasse führt den Vergleich zweier Instanzen von T durch. Der Vorteil ist, dass Sie die ursprüngliche Klasse nicht ändern müssen. Außerdem können Sie verschiedene Vergleiche definieren, so dass für einen Vergleich zwei Klassen gleich sind, in einem anderen Vergleich jedoch nicht. Sie verwenden das IEqualityComparer<T> nur, wenn Sie es anwenden möchten.

+1

Sie brauchen nicht nur 'Equals außer Kraft zu setzen()' Sie auch 'GetHashCode überschreiben müssen()' –

2

IEquatable sollte alles sein, was Sie benötigen, um festzustellen, ob eine Instanz gleich anderen ist.

Wenn Sie sich mit Ihrem Typ als Schlüssel für eine Hash-Sammlung planen (wie Dictionary oder HashTable), dann Sie haben object.GetHashCode() und object.Equals(object) außer Kraft zu setzen. Selbst wenn Sie nicht tun, ist es immer noch eine gute Idee, da das Überschreiben object.Equals trivial ist, wenn Sie IEquatable implementiert haben, und überschreiben object.Equals(object) erfordert, dass Sie auch GetHashCode überschreiben.

Verwandte Themen