2010-03-09 21 views

Antwort

160

IEquatable testet, ob zwei Objekte gleich sind.

IComparable erzwingt eine Gesamtordnung für die zu vergleichenden Objekte.

Zum Beispiel würde IEquatable Ihnen sagen, dass 5 bis 7 nicht gleich IComparable würde Ihnen sagen, dass 5 vor 7 kommt

7

Wie auf der MSDN Page for IEquatable erklärte:

Die IComparable-Schnittstelle definiert die CompareTo Methode, die die Sortierreihenfolge der Instanzen des Implementierungstyp bestimmt. Die IEquatable Schnittstelle definiert die Equals Methode, , die die Gleichheit von Instanzen des Implementierungstyps bestimmt.

Equals gegen CompareTo

10

Neben Greg D's Antwort:

Sie könnten IComparable implementieren, ohne IEquatable für eine Klasse Implementierung, wo eine partielle Ordnung Sinn macht, und wo sehr auf jeden Fall wünschen Sie den Verbraucher um die Folgerung zu ziehen, dass, nur weil CompareTo() Null zurückgibt, dies nicht bedeutet, dass die Objekte gleich sind (für alles andere als Sortierzwecke).

+9

Das klingt viel mehr nach einem Sonderfall-Vergleich als nach einem Objekt, das IComparable richtig implementiert. Können Sie sich ein aussagekräftiges Beispiel vorstellen, in dem 'CompareTo (...) == 0 '** nicht ** Gleichheit impliziert? Das kann ich nicht. Tatsächlich erfordert der Schnittstellenvertrag (gemäß MSDN) **, dass "CompareTo (...) == 0" Gleichheit impliziert. Um es klar zu sagen: Verwenden Sie in einem solchen Fall ein spezielles Comparator-Objekt, implementieren Sie nicht IComparable. –

+2

@Konrad - Ich habe mehrere Vorbehalte angezeigt - dass der Typ IEquatable nicht implementiert (so offensichtlich, der Absender möchte nicht einen Gleichheitstest enthalten), und dass CompareTo Ergebnisse zum Sortieren verwendet werden, * nicht *, um die Gleichheit zu bewerten . Sie kommen auch in die Frage, welche Gleichheit relevant ist (Bezug, Wert, Ignorieren von "beliebigen" Attributen) - ein blaues Buch von 500 Seiten Länge kann einem roten Buch von 500 Seiten Länge "gleichwertig" sein für die Zwecke von IComparable) –

+3

Ihr letzter Satz ist falsch, und das ist der besondere Fehler, auf den ich hinweisen wollte: "IComparable" ist hier völlig unpassend. Was Sie haben, ist eine sehr spezielle Reihenfolge, die nur in einer speziellen Situation gilt. In solchen Situationen ist die Implementierung eines allgemeinen "IComparable" falsch. Dafür ist IComparer da. Zum Beispiel können Menschen nicht sinnvoll bestellt werden. Aber sie können nach ihrem Gehalt, ihrer Schuhgröße, der Anzahl ihrer Sommersprossen oder ihrem Gewicht geordnet werden. Daher würden wir für alle diese Fälle verschiedene "IComparers" implementieren. –

13

IEquatable<T> für die Gleichheit.

IComparable<T> zur Bestellung.