IComparable
funktioniert nur in eine Richtung
Angenommen, Sie haben eine Employee
Klasse. In einer Ansicht möchten Sie alle Employees
nach 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 Customer
nach Namen sortiert angezeigt wird, gibt es überhaupt keinen Code, der impliziert, wie er sortiert werden soll.
Andererseits geht die Customer
Klasse 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 Customer
Klasse 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 IComparable
Implementierung 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 IComparable
meine 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 IComparable
als minderwertig IComparer
oder .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, IComparer
oder LINQ zu verwenden, oder gibt es Vorteile / Anwendungsfälle, die ich hier nicht sehe?
IComparable
mehr verwenden, was meinen Standpunkt verstärkt.
SortedXXX
Sammlungen entweder die gespeicherten Elemente vorhanden sein müssen IComparable
oder IComparer
bereitgestellt werden müssen. Beachten Sie auch, dass es trivial ist, die natürliche Sortierreihenfolge mit einem Vergleicher umzukehren und mit allen IComparable
Objekten arbeiten zu lassen.
IComparable
wird als Standardvergleichsmechanismus angesehen . IComparer
wird verwendet, wenn Sie den Standardvergleichsmechanismus überschreiben möchten.
ReverseComparer<T>
: gist.github.com/jackfarrington/078e7af7bc82482aa634