Beide Schnittstellen scheinen Objekte auf Gleichheit zu vergleichen. Was sind also die Hauptunterschiede zwischen ihnen?
quelle
Beide Schnittstellen scheinen Objekte auf Gleichheit zu vergleichen. Was sind also die Hauptunterschiede zwischen ihnen?
IEquatable
testet, ob zwei Objekte gleich sind.
IComparable
legt den zu vergleichenden Objekten eine Gesamtreihenfolge auf.
Zum Beispiel IEquatable
würde ich Ihnen sagen, dass 5 nicht gleich 7 ist. IComparable
Würde Ihnen sagen, dass 5 vor 7 kommt.
Zusätzlich zu Greg Ds Antwort:
Sie könnten implementieren , IComparable
ohne die Umsetzung IEquatable
für eine Klasse , wo eine partielle Ordnung Sinn macht, und wo man sehr auf jeden Fall den Verbraucher zu schließen wollen , dass nur weil CompareTo()
Null zurückgibt, dies nicht bedeutet , dass die Objekte gleich sind (für etwas anderes als Sortierzwecke).
IComparable
ordnungsgemäß implementiert wird. Können Sie mit einem aussagekräftigen Beispiel kommen , wennCompareTo(…) == 0
sie nicht der Gleichheit bedeuten? Ich kann es bestimmt nicht. Tatsächlich erfordert der Schnittstellenvertrag (gemäß MSDN) , dassCompareTo(…) == 0
Gleichheit impliziert wird. Um es ganz klar auszudrücken: Verwenden Sie in einem Fall wie Ihrem ein speziellesComparator
Objekt und implementieren Sie es nichtIComparable
.IComparable
ist hier völlig unangemessen. Was Sie haben, ist eine ganz bestimmte Bestellung, die nur in einer speziellen Situation gilt. In solchen Situationen ist die Implementierung eines GeneralsIComparable
falsch. Dafür sind wirIComparer
da. Zum Beispiel können Personen nicht sinnvoll bestellt werden. Sie können jedoch nach ihrem Gehalt, ihrer Schuhgröße, der Anzahl ihrer Sommersprossen oder ihrem Gewicht bestellt werden. Daher würden wirIComparer
für all diese Fälle unterschiedliche s implementieren .Wie auf der MSDN-Seite für IEquatable angegeben :
Equals
vs.CompareTo
quelle
IComparable <T>
definiert eine typspezifische Vergleichsmethode, mit der Objekte sortiert oder sortiert werden können.IEquatable <T>
definiert eine verallgemeinerte Methode, die zur Bestimmung der Gleichheit implementiert werden kann.Angenommen, Sie haben eine Personenklasse
Um diese Objekte zu sortieren, können Sie verwenden
people.Sort();
.Dies wird jedoch eine Ausnahme auslösen.
Framework kann diese Objekte nicht sortieren. Sie müssen angeben, wie die Implementierungsschnittstelle sortiert
IComparable
werden soll.Dadurch wird das Array mit der
Sort()
Methode ordnungsgemäß sortiert .Um zwei Objekte zu vergleichen, können Sie die
Equals()
Methode verwenden.Dies wird zurückgegeben,
false
da dieEquals
Methode nicht weiß, wie zwei Objekte verglichen werden sollen. Daher müssen Sie dieIEquatable
Schnittstelle implementieren und dem Framework mitteilen, wie der Vergleich durchgeführt werden soll. Wenn Sie das vorherige Beispiel erweitern, sieht es so aus.quelle
IEquatable
ein Generikum verwendet<Person>
undIComparable
nicht?