2011-10-13 19 views
6

el método 'Igual' y 'GetHashcode' existen en la clase de objeto, y nuestro tipo hereda la clase base del objeto. ¿cuál es la diferencia entre implementar los dos métodos del objeto directamente y usar la interfaz IComparer?¿Por qué necesitamos la interfaz IEqualityComparer, IEqualityComparer <T>?

si anulamos Igual y GetHashCode del objeto, y presionamos a una tabla hash, ¿usará el método igual de overring?

¿Cuáles son los diferentes de una nueva tabla hash con el constructor de IEqualityComparer?

Respuesta

14

La interfaz IComparable se utiliza cuando necesita para "ordenar" objetos, y le da un método (CompareTo) que le dice si dos objetos son <, = o>. El constructor que usa IEqualityComparer le permite dar un Equals/GetHashCode específico que puede ser diferente de los definidos por su objeto. Normalmente, el Hashtable utilizará su objeto anulado Equals y GetHashCode (o la base objectEquals y GetHashCode).

para hacer un ejemplo, la cadena estándar se compara en forma sensible a mayúsculas ("A"! = "a"), pero se puede hacer una clase IEqualityComparer ayudante para poder desmenuzar las cuerdas de una manera insensible caso. (Técnicamente esta clase ya está presente en múltiples variantes: se llaman StringComparer.InvariantCultureIgnoreCase y todos los otros métodos estáticos de StringComparer que devuelven un objeto StringComparer que implementa el IComparer, IEqualityComparer, IComparer<string>, IEqualityComparer<string>)

Como nota, los Hashtable usos un parámetro opcional IEqualityComparer, no la versión genérica IEqualityComparer<T>, porque Hashtable es pregenérico.

1

las interfaces IComparer (genéricas y no genéricas) le permiten comparar dos instancias entre sí.

El método Compare le permite comparar un objeto con otra instancia. Por supuesto, cuando la instancia actual es nula, obtendrá un NullReferenceException en este caso, ya que llama al Compare en una instancia 'nula'. Una clase que implementa IComparer puede solucionar este problema.

Por lo tanto, cuando se implementa la interfaz IComparer, tendrá una clase que tiene un método 'Comparar', que se puede llamar así:

public class MyObjectComparer : IComparer<MyObject> 
{ 
    public int Compare(MyObject first, MyObject second) 
    { 
     // implement logic here to determine whether first is less, greater or equal then second. 
    } 
} 

Esto le permite hacer esto:

var c = new MyObjectComparer(); 
var one = new MyObject(); 
var two = new MyObject(); 
c.Compare (one, two); 

Cuando se instancia un Hashtable con el constructor donde se especifica la instancia IEqualityComparer, esto significa que la dada IEqualityComparer se utilizarán para determinar si una determinada clave ya está presente en la tabla hash.
De lo contrario, se usará el método de comparación del objeto clave.

Cuestiones relacionadas