IComparable funktioniert nur in eine Richtung
Angenommen, Sie haben eine EmployeeKlasse. In einer Ansicht möchten Sie alle Employeesnach Namen sortiert anzeigen - in einer anderen nach Adresse. Wie wirst du das erreichen? Nicht mit IComparable, zumindest nicht in irgendeiner Weise.
IComparable hat die Logik am falschen Ort
Die Schnittstelle wird durch Aufruf verwendet .Sort(). In einer Ansicht, die Customernach Namen sortiert angezeigt wird, gibt es überhaupt keinen Code, der impliziert, wie er sortiert werden soll.
Andererseits geht die CustomerKlasse davon aus, wie sie verwendet werden soll - in diesem Fall wird sie in einer nach Namen sortierten Liste verwendet.
IComparable wird implizit verwendet
Im Vergleich zu den Alternativen ist es sehr schwierig zu erkennen, wo die Vergleichslogik verwendet wird - oder wenn überhaupt. Unter der Annahme Ihrer Standard-IDE und ausgehend von der CustomerKlasse muss ich
- Suchen Sie nach allen Verweisen auf
Customer - Suchen Sie die Referenzen, die in einer Liste verwendet werden
- Überprüfen Sie, ob diese Listen sie jemals
.Sort()aufgerufen haben
Was wahrscheinlich schlimmer ist, wenn Sie eine IComparableImplementierung entfernen , die noch verwendet wird, erhalten Sie keine Fehler oder Warnungen. Das einzige, was Sie bekommen, ist falsches Verhalten an allen Orten, die zu dunkel waren, als dass Sie daran denken könnten.
Diese Probleme zusammen mit sich ändernden Anforderungen
Der Grund, warum ich darüber nachgedacht habe, ist, dass es für mich schief gelaufen ist. Ich benutze IComparablemeine Anwendung seit 2 Jahren gerne . Jetzt haben sich die Anforderungen geändert und das Ding muss auf zwei verschiedene Arten sortiert werden. Es ist aufgefallen, dass es keinen Spaß macht, die im vorherigen Abschnitt beschriebenen Schritte durchzugehen.
Die Frage
Diese Probleme lassen mich IComparableals minderwertig ICompareroder .OrderBy()bis zu dem Punkt denken , dass ich keinen gültigen Anwendungsfall sehe, der durch die Alternativen nicht besser bedient werden könnte.
Ist es immer besser, ICompareroder LINQ zu verwenden, oder gibt es Vorteile / Anwendungsfälle, die ich hier nicht sehe?
IComparablemehr verwenden, was meinen Standpunkt verstärkt.
SortedXXXSammlungen entweder die gespeicherten Elemente vorhanden sein müssen IComparableoder IComparerbereitgestellt werden müssen. Beachten Sie auch, dass es trivial ist, die natürliche Sortierreihenfolge mit einem Vergleicher umzukehren und mit allen IComparableObjekten arbeiten zu lassen.
IComparablewird als Standardvergleichsmechanismus angesehen . IComparerwird verwendet, wenn Sie den Standardvergleichsmechanismus überschreiben möchten.
ReverseComparer<T>: gist.github.com/jackfarrington/078e7af7bc82482aa634