.net icomparable icomparer

.net - Cuándo usar IComparable<T> Vs. IComparer<T>



(8)

Como otros han dicho, no hacen lo mismo.

En cualquier caso, en estos días tiendo a no utilizar IComparer. ¿Por qué habría? Su responsabilidad (una entidad externa utilizada para comparar dos objetos) puede manejarse mucho más limpia con una expresión lambda, similar a la forma en que funcionan la mayoría de los métodos de LINQ. Escribe un lambda rápido que toma los objetos para compararlos como argumentos, y devuelve un bool. Y si el objeto define su propia operación de comparación intrínseca, puede implementar IComparable en su lugar.

Estoy tratando de descubrir cuál de estas interfaces necesito implementar. Ambos esencialmente hacen lo mismo. ¿Cuándo usaría uno sobre el otro?


Depende de la entidad. Por ejemplo, para una clase como "Estudiante", tendrá sentido tener IComparable basado en Nombre.

class Student : IComparable { public string Name { get; set; } public int MathScore { get; set; } public int EnglishScore { get; set; } public int TotalScore { get { return this.MathScore + this.EnglishScore; } } public int CompareTo(object obj) { return CompareTo(obj as Student); } public int CompareTo(Student other) { if (other == null) { return 1; } return this.Name.CompareTo(other.Name); } }

Pero si un docente "A" desea comparar a los alumnos según MathScore, y el docente "B" desea compararlos según el puntaje en inglés. Será una buena idea implementar IComparer por separado. (Más como un patrón de estrategia)

class CompareByMathScore : IComparer<Student> { public int Compare(Student x, Student y) { if (x.MathScore > y.MathScore) return 1; if (x.MathScore < y.MathScore) return -1; else return 0; } }


IComparable dice que un objeto se puede comparar con otro. IComparer es un objeto que puede comparar dos elementos.


IComparer es una interfaz que se utiliza para ordenar la matriz, esta interfaz obligará a la clase a implementar el método de comparación (T x, T y), que comparará los dos objetos. La instancia de la clase que implementó esta interfaz se usa en la clasificación de la matriz.

IComparable es una interfaz implementada en el tipo que necesita comparar los dos objetos del mismo tipo. Esta interfaz comparable obligará a la clase a implementar el siguiente método CompareTo (T obj)

IEqualityComparer es una interfaz que se usa para encontrar el objeto, ya sea igual o no. Ahora veremos esto en una muestra donde tenemos que encontrar el Distintivo de un Objeto en una colección. Esta interfaz implementará un método Equals (T obj1, T obj2)

Ahora tomamos un Ejemplo que tenemos una clase Empleado, basado en esta clase tenemos que crear una Colección. Ahora tenemos los siguientes requisitos.

Ordene la matriz usando la clase Array 2. Necesita una colección usando Linq: elimine la duplicación, ordene de mayor a menor, elimine una identificación de empleado

abstract public class Person { public string FirstName { get; set; } public string LastName { get; set; } public string Address { set; get; } } public enum SortType { ByID, BySalary }

Clase pública EmployeeIdSorter: IComparer {public int Compare (Empleado x, Empleado y) {if (x.Id <y.Id) return 1; else if (x.Id> y.Id) devuelve -1; else devuelve 0; }}

public class EmployeeSalarySorter : IComparer<Employee> { public int Compare(Employee x, Employee y) { if (x.Salary < y.Salary) return 1; else if (x.Salary > y.Salary) return -1; else return 0; } }

Para más información refiérase a continuación http://dotnetvisio.blogspot.in/2015/12/usage-of-icomparer-icomparable-and.html


Todo depende de si tu tipo es mutable o no. Solo debe implementar IComparable en tipos no modificables. Tenga en cuenta que si implementa IComparable, debe anular Equals, junto con los operadores ==,! =, <Y> (consulte Advertencia de análisis de código CA1036).

Citando a Dave G de esta publicación en el blog :

Pero la respuesta correcta es implementar IComparer en lugar de IComparable si sus objetos son mutables, y pasar una instancia de IComparer a las funciones de clasificación cuando sea necesario.

Como el IComparer es solo un objeto desechable utilizado para clasificar en ese momento, tu objeto puede tener cualquier semántica mutable que desees. Además, no requiere ni sugiere el uso de Equals, GetHashCode o ==; puede definirlo de la forma que desee.

Finalmente, puede definir varios IComparer para su tipo para clasificar en diferentes campos o con diferentes reglas. Esto es mucho más flexible que estar atascado con una definición.

En resumen: use IComparable para los tipos de valores e IComparer para los tipos de referencia.


Use IComparable<T> cuando la clase tenga una comparación intrínseca.

Use IComparer<T> cuando desee un método de comparación que no sea la comparación intrínseca de la clase, si tiene uno.


Explicación simple a través de una historia

baloncesto de la escuela secundaria. es una selección de patio de escuela para los equipos. Quiero conseguir la gente más alta / mejor / más rápida en mi equipo. ¿Qué debo hacer?

Interfaz Icomparer - Comparar dos personas por separado

  • Esto me permite comparar dos tipos alineados ... eso es básicamente eso. Fred vs John .......... los arrojo a una clase concreta que implementa la interfaz. Compare(Fred, John) y escupe quién es mejor.

¿Qué hay de IComparable? - Compare usted mismo con alguien más

¿Has estado en FB recientemente? Ves a otras personas haciendo cosas geniales: viajar por el mundo, crear inventos, mientras estás atrapado en el sótano de la mamas escribiendo respuestas de desbordamiento de la pila; bueno, lo que estás haciendo es usar la interfaz de IComparable.

  • Está comparando la instancia actual (usted mismo) con otro objeto (alguien más) que es del mismo tipo (persona).

¿Qué pasa con la clase Comparer?

La clase Comparer es una clase base abstracta que implementa la interfaz Icomparer. Debes derivarte de esta clase para tener una implementación concreta. de todos modos, Microsoft recomienda que utilice la clase Comparer en lugar de implementar la interfaz Icomparer:

Recomendamos que derive de la clase Comparer en lugar de implementar la interfaz IComparer, porque la clase Comparer proporciona una implementación de interfaz explícita del método IComparer.Compare y la propiedad Default que obtiene el comparador predeterminado para el objeto.

Resumen

  • IComparer: alinea dos cosas y compara.
  • IComparable: compárese con los demás en FB.

Espero que las historias te ayuden a recordar.


Bueno, no son exactamente lo mismo que IComparer<T> se implementa en un tipo que es capaz de comparar dos objetos diferentes, mientras que IComparable<T> se implementa en tipos que pueden compararse con otras instancias del mismo tipo.

Tiendo a usar IComparable<T> para cuando necesito saber cómo se relaciona otra instancia con this instancia. IComparer<T> es útil para clasificar colecciones ya que IComparer<T> encuentra fuera de la comparación.