beide Schnittstellen scheinen Objekte auf Gleichheit zu vergleichen, was sind die Hauptunterschiede zwischen ihnen?Was ist der Unterschied zwischen IComparable und IEquatable-Schnittstellen?
Antwort
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
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 dieEquals
Methode, , die die Gleichheit von Instanzen des Implementierungstyps bestimmt.
Equals
gegen CompareTo
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).
IEquatable<T>
für die Gleichheit.
IComparable<T>
zur Bestellung.
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. –
@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) –
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. –