IComparable solo funciona de una manera
Digamos que tienes una Employeeclase. En una vista, desea mostrar todo Employeesordenado 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 Customerordenado por nombre, no hay ningún código que implique cómo se va a ordenar.
Por otro lado, la Customerclase 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 Customerclase, 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 IComparableimplementació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 IComparableen 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 IComparableinferior IComparero .OrderBy(), hasta el punto de no ver ningún caso de uso válido que las alternativas no sirvan mejor.
¿Siempre es mejor usar IComparero LINQ, o hay ventajas / casos de uso que no estoy viendo aquí?
IComparablemás, lo que está reforzando mi punto.
SortedXXXcolecciones, requieren que los elementos almacenados sean IComparableo que se IComparerproporcionen. 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 IComparableobjetos.
IComparablese considera el mecanismo de comparación predeterminado . IComparerse usa cuando desea anular el mecanismo de comparación predeterminado.
ReverseComparer<T>: gist.github.com/jackfarrington/078e7af7bc82482aa634