IComparable funziona solo in un modo
Supponiamo che tu abbia una classe Employee . In una vista, vuoi mostrare tutto Employees ordinato per nome - in un altro, per indirizzo. Come hai intenzione di raggiungere questo? Non con IComparable , almeno non in modo idiomatico.
IComparable ha la logica nel posto sbagliato
L'interfaccia viene utilizzata chiamando .Sort() . In una vista che mostra Customer ordinata per nome, non vi è alcun codice per implicare il modo in cui verrà ordinato.
D'altra parte, la classe Customer sta assumendo come verrà utilizzata - in questo caso, verrà utilizzata in una lista ordinata per nome.
IComparable è usato implicitamente
In confronto con le alternative, è molto difficile vedere dove viene utilizzata la logica comparativa, o se non del tutto. Assumendo il tuo IDE standard e partendo dalla classe Customer , dovrò
- Cerca tutti i riferimenti a
Customer - Trova i riferimenti utilizzati in un elenco
- Verifica se tali elenchi hanno mai ricevuto
.Sort()su di essi
Ciò che è probabilmente peggio, se rimuovi un'implementazione IComparable ancora in uso, non ricevi alcun errore o avviso. L'unica cosa che otterrai è un comportamento sbagliato in tutti i posti che erano troppo oscuri per te da pensare.
Questi problemi combinati, oltre a cambiare i requisiti
La vera ragione per cui sono venuto a pensare a questo è perché è andato storto per me. Ho usato felice IComparable nella mia domanda per 2 anni. Ora, i requisiti sono cambiati e la cosa deve essere ordinata in 2 modi diversi. Ha notato che non è divertente seguire i passaggi descritti nella sezione precedente.
La domanda
Questi problemi mi fanno pensare a IComparable come inferiore a IComparer o .OrderBy() , al punto di non vedere alcun caso d'uso valido che non sarebbe servito meglio dalle alternative.
È sempre meglio usare IComparer o LINQ, o ci sono vantaggi / casi d'uso che non vedo qui?