Pregunta

Estoy tratando de averiguar cuál de estas interfaces que necesito para poner en práctica. Ambos básicamente hacen lo mismo. Cuándo se debe utilizar uno sobre el otro?

¿Fue útil?

Solución

Bueno, ellos no son muy 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 los tipos que son capaces de compararse con otras instancias de la mismo tipo.

Yo tiendo a usar IComparable<T> para los momentos en que necesito saber cómo otro caso se refiere a this ejemplo. IComparer<T> es útil para la clasificación de colecciones como la IComparer<T> se encuentra fuera de la comparación.

Otros consejos

Uso IComparable<T> cuando la clase tiene una comparación intrínseca.

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

Depende de la entidad. Por ejemplo después de 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);  
    }
}

Sin embargo, si un maestro 'A' quiere comparar a los estudiantes sobre la base de MathScore, y maestro 'B' quiere comparar a los estudiantes sobre la base de EnglishScore. Será buena idea para poner en práctica 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;
    }
}

Todo depende de si el tipo es mutable o no. Usted debe Sólo IComparable aplicar sobre los tipos no mutables. Tenga en cuenta que si se implementa IComparable, debe invalidar los Iguales, junto con el ==,! =, <> Y operadores (ver Análisis código de advertencia CA1036).

Citando a Dave G desde esta entrada del blog :

  

Sin embargo, la respuesta correcta es poner en práctica IComparer en lugar de IComparable si los objetos son mutables, y pasar una instancia de la IComparer a funciones de ordenación cuando sea necesario.

     

Desde el IComparer es sólo un objeto desechable utilizada para la clasificación en ese punto en el tiempo, el objeto puede tener cualquier semántica mutables que usted desea. Además, no requiere ni siquiera sugiere que utilizan iguales, GetHashCode, o == -. Usted es libre de definir de ninguna manera por favor

     

Por último, se pueden definir múltiples de IComparer para su tipo para la clasificación en diferentes campos o con diferentes reglas. Esto es mucho más flexible que ser pegado con una definición.

     

En pocas palabras:. Uso IComparable de los tipos de valor y tipos de referencia para IComparer

Explicación sencilla a través de una historia

baloncesto de la escuela. Es un pick patio de la escuela para los equipos. Quiero conseguir las mejores personas más altas / / más rápido en mi equipo. ¿Qué hago?

Interfaz IComparer - Comparación de dos personas distintas personas

  • Esto me permite comparar dos chicos alineados ......... eso es básicamente la misma. Fred vs John .......... las tiro en una clase concreta que implementa la interfaz. Compare(Fred, John) y escupe quién es mejor.

¿Qué hay de IComparable - Compárese con otra persona

Ha estado en FB recientemente? Ves otras personas haciendo cosas interesantes:. Viajando por el mundo, la creación de invenciones, mientras yo estoy haciendo algo que no está tan fresco - bien lo que estamos haciendo está haciendo uso de la interfaz IComparable

  • Estamos comparando la instancia actual (se) con otro objeto (de otra persona), que es del mismo tipo (persona).

¿Qué hay de la Clase Comparer?

La clase Comparer es una clase base abstracta que implementa la interfaz IComparer. Usted debe derivar de esta clase para tener una aplicación concreta. de todos modos, Microsoft recomienda que utilice la clase Comparer en lugar de implementar la interfaz IComparer:

  

Le recomendamos que se derivan 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 por defecto que obtiene el comparador predeterminado para el objeto.

Resumen

  • IComparer - línea de dos cosas y compara
  • .
  • IComparable - comparas con los demás en FB
  • .

Espero que las historias ayudan a recordar.

Como han dicho otros, no hacen lo mismo.

En cualquier caso, estos días no tienden a utilizar IComparer. ¿Por qué habría? Su responsabilidad (una entidad externa se utiliza para comparar dos objetos) se puede tratar de forma mucho más limpio, con una expresión lambda, similar a cómo la mayoría de los métodos de trabajo de LINQ. Escribir un lambda rápida que toma los objetos de comparar como argumentos, y devuelve un bool. Y si el objeto define su propio funcionamiento intrínseco comparar, se puede aplicar IComparable lugar.

IComparable dice que un objeto puede ser comparado 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 para implementar la Comparar método (T x, T y), que compara los dos objetos. La instancia de la clase que implementa esta interfaz se utiliza en la manipulación de la matriz.

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

IEqualityComparer es una interfaz que se utiliza para encontrar el objeto si éste es igual o no, ahora vamos a ver esto en una muestra donde tenemos que encontrar la característica de un objeto en una colección. Esta interfaz implementará un método Es igual a (T obj1, T obj2)

Ahora que tomar un ejemplo que tenemos una clase de empleado, basado en esta clase tenemos que crear una colección. Ahora tenemos los siguientes requisitos.

ordenar la matriz utilizando la clase Array 2. Necesidad de una colección utilizando LINQ: Retire el duplicado, Orden de mayor a menor, retire 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
}

EmployeeIdSorter clase pública: IComparer         {             Comparar public int (x Empleado, Empleado y)             {                 si (x.Id y.Id)                     volver -1;                 más                     return 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 obtener más información informenos por debajo http://dotnetvisio.blogspot.in/2015/12 /usage-of-icomparer-icomparable-and.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top