IComparable
solo funciona de una manera
Digamos que tienes una Employee
clase. En una vista, desea mostrar todo Employees
ordenado por nombre, en otra, por dirección. ¿Cómo vas a lograr eso? No con IComparable
, al menos no de ninguna manera idiomática.
IComparable
tiene la lógica en el lugar equivocado
La interfaz se usa llamando .Sort()
. En una vista que muestra Customer
ordenado por nombre, no hay ningún código que implique cómo se va a ordenar.
Por otro lado, la Customer
clase está asumiendo cómo se va a usar, en este caso, que se usará en una lista ordenada por nombres.
IComparable
se usa implícitamente
En comparación con las alternativas, es muy difícil ver dónde se está utilizando la lógica de comparación, o si es que lo está. Asumiendo su IDE estándar y comenzando desde la Customer
clase, tendré que
- Buscar todas las referencias a
Customer
- Encuentra las referencias que se usan en una lista
- Verifique si esas listas las han
.Sort()
llamado alguna vez
Lo que probablemente sea peor, si elimina una IComparable
implementación que todavía se está utilizando, no recibirá ningún error o advertencia. Lo único que obtendrá es un comportamiento incorrecto en todos los lugares que eran demasiado oscuros para que usted piense.
Estos problemas combinados, más requisitos cambiantes
La razón por la que llegué a pensar en esto es porque me salió mal. He estado felizmente usando IComparable
en mi aplicación durante 2 años. Ahora, los requisitos cambiaron y la cosa necesita ser ordenada de 2 maneras diferentes. Se ha dado cuenta de que no es divertido seguir los pasos descritos en la sección anterior.
La pregunta
Estos problemas me hacen pensar que soy IComparable
inferior IComparer
o .OrderBy()
, hasta el punto de no ver ningún caso de uso válido que las alternativas no sirvan mejor.
¿Siempre es mejor usar IComparer
o LINQ, o hay ventajas / casos de uso que no estoy viendo aquí?
IComparable
más, lo que está reforzando mi punto.
SortedXXX
colecciones, requieren que los elementos almacenados sean IComparable
o que se IComparer
proporcionen. También tenga en cuenta que es trivial invertir el orden de clasificación natural con un comparador y hacer que funcione con todos los IComparable
objetos.
IComparable
se considera el mecanismo de comparación predeterminado . IComparer
se usa cuando desea anular el mecanismo de comparación predeterminado.
ReverseComparer<T>
: gist.github.com/jackfarrington/078e7af7bc82482aa634