IComparable só funciona de uma maneira
Digamos que você tenha uma Employeeaula. Em uma exibição, você deseja mostrar todas as Employeesordenadas por nome - em outra, por endereço. Como você vai conseguir isso? Não com IComparable, pelo menos não de maneira idiomática.
IComparable tem a lógica no lugar errado
A interface é usada chamando .Sort(). Em uma exibição que mostra Customerclassificada por nome, não há nenhum código que implique como será classificado.
Por outro lado, a Customerclasse está assumindo como será usada - nesse caso, que será usada em uma lista classificada por nomes.
IComparable é usado implicitamente
Em comparação com as alternativas, é muito difícil ver onde a lógica de comparação está sendo usada - ou se é que existe. Supondo que seu IDE padrão e a partir da Customerclasse, terei que
- Pesquise todas as referências a
Customer - Encontre as referências usadas em uma lista
- Verifique se essas listas já os
.Sort()chamaram
O que é provavelmente pior, se você remover uma IComparableimplementação que ainda está sendo usada, você não receberá nenhum erro ou aviso. A única coisa que você terá é o comportamento errado em todos os lugares que eram muito obscuros para você pensar.
Essas questões combinadas, além de requisitos variáveis
O motivo pelo qual eu vim a pensar sobre isso é porque deu errado para mim. Felizmente, uso IComparablemeu aplicativo há 2 anos. Agora, os requisitos foram alterados e a coisa precisa ser classificada de duas maneiras diferentes. Percebeu que não é divertido seguir as etapas descritas na seção anterior.
A questão
Esses problemas me fazem pensar IComparablecomo inferior a IComparerou .OrderBy(), a ponto de não ver nenhum caso de uso válido que não seria melhor atendido pelas alternativas.
É sempre melhor usar IComparerou LINQ, ou existem vantagens / casos de uso que não estou vendo aqui?
IComparablemais, o que está reforçando meu argumento.
SortedXXXcoleções, elas exigirão que os elementos armazenados sejam IComparableou sejam IComparerfornecidos. Observe também que é trivial reverter a ordem de classificação natural com um comparador e fazê-la funcionar com todos os IComparableobjetos.
IComparableé considerado o mecanismo de comparação padrão . ICompareré usado quando você deseja substituir o mecanismo de comparação padrão.
ReverseComparer<T>: gist.github.com/jackfarrington/078e7af7bc82482aa634