c# .net icomparable icomparer

c# - diferencia entre IComparable e IComparer



.net (6)

Como su nombre lo indica, IComparable<T> dice que soy comparable . IComparable<T> cuando se define para T permite comparar la instancia actual con otra instancia del mismo tipo. IComparer<T> dice que soy un comparador, comparo . IComparer<T> se utiliza para comparar dos instancias de T , normalmente fuera del alcance de las instancias de T

En cuanto a para qué sirven puede ser confuso al principio. De la definición debe quedar claro que, por lo tanto, IComparable<T> (definido en la propia clase T ) debe ser el estándar de facto para proporcionar la lógica para la clasificación. El orden predeterminado en la List<T> etc. se basa en esto. Implementar IComparer<T> en T no ayuda a la clasificación regular. Posteriormente, hay poco valor para implementar IComparable<T> en cualquier otra clase que no sea T Esta:

class MyClass : IComparable<T>

rara vez tiene sentido

Por otra parte

class T : IComparable<T> { public int CompareTo(T other) { //.... } }

Es como se debe hacer.

IComparer<T> puede ser útil cuando requiere una ordenación basada en un orden personalizado, pero no como una regla general. Por ejemplo, en una clase de Person en algún momento, es posible que deba ordenar a las personas según su edad. En ese caso puedes hacer:

class Person { public int Age; } class AgeComparer : IComparer<Person> { public int Compare(Person x, Person y) { return x.Age - y.Age; } }

Ahora, el AgeComparer ayuda a clasificar una lista según la Age .

var people = new Person[] { new Person { age = 23 }, new Person(){ age = 22 } }; people.Sort(p, new AgeComparer()); //person with age 22 comes first now.

De IComparer<T> similar, IComparer<T> en T no tiene sentido.

class Person : IComparer<Person>

Es cierto que esto funciona, pero no se ve bien a los ojos y derrota a la lógica.

Generalmente lo que necesitas es IComparable<T> . También idealmente, puede tener solo un IComparable<T> mientras que múltiples IComparer<T> es posible en función de diferentes criterios.

El IComparer<T> y el IComparable<T> son exactamente análogos al IEqualityComparer<T> y al IEquatable<T> que se utilizan para probar la igualdad en lugar de comparar / clasificar; Un buen hilo here donde escribí exactamente la misma respuesta :)

Esta pregunta ya tiene una respuesta aquí:

¿Cuál es la diferencia entre las interfaces IComparable e IComparer ? ¿Es necesario utilizar esta interfaz siempre con el método Array.Sort()


IComparable se utiliza para proporcionar un orden de clasificación predeterminado para sus objetos.

IComparer es proporcionar mecanismos de comparación adicionales.

Vea este artículo para referencia. http://support.microsoft.com/kb/320727


IComparer compara dos objetos que se le dan. IComparable es implementado por el objeto que se está comparando, con el propósito de comparar con otro de sí mismo.

Es una buena idea implementar IComparable para ordenar objetos. IComparable puede ser útil para clasificar por diferentes criterios (por ejemplo, ordenar por un campo seleccionable en el objeto).

Vea también: Cuándo usar IComparable <T> Vs. IComparer <T>


La mejor explicación que he leído es "El objeto que se ordenará implementará IComparable, mientras que la clase que ordenará los objetos implementará IComparer". ( source )

Si los objetos que está tratando de ordenar no implementan IComparable, deberá crear una clase que implemente IComparer (y acepte esos tipos de objetos para comparación) y pasarlo al método Array.Sort ().


Los objetos que son instancias de clases que implementan IComparable se pueden comparar con otros objetos. (Lea IComparable como "Puedo compararme"). El método en esta interfaz que hace esto es CompareTo . Esto es útil si desea que las instancias de dichas clases sepan cómo compararse con otros objetos.

Los objetos que son instancias de clases que implementan IComparer se pueden usar para comparar pares de objetos. (Lea IComparer como "Puedo comparar"). El método en esta interfaz que hace esto es Compare . Esto es útil si desea desacoplar la lógica de comparación de la clase de objetos que se comparan. Un caso en el que podría usar esto si tiene varias formas de comparar objetos (comparaciones de cadenas que distinguen entre mayúsculas y mayúsculas y minúsculas).


  • IComparable: define una interfaz para un objeto con un método CompareTo () que toma otro objeto del mismo tipo y compara el objeto actual con el objeto pasado. Interioriza la comparación con el objeto, lo que permite una operación de comparación más en línea, y es útil cuando solo hay una forma lógica, o una forma predeterminada muy común, para comparar objetos de un tipo.
  • IComparer: define una interfaz con un método Compare () que toma dos objetos de otro tipo (que no tienen que implementar IComparable) y los compara. Esto externaliza la comparación, y es útil cuando hay muchas formas posibles de comparar dos objetos de un tipo, o cuando el tipo no implementa IComparable (o la implementación de IComparable compara una forma diferente de la que usted desea) y no lo hace. tener control sobre la fuente de ese tipo.