2010-03-20 15 views
5

Hice una pregunta aquí: When To Use IEquatable And Why sobre el uso de IEquatable.¿Alguien sabe qué sucede si no implementa iequtalable cuando usa colecciones genéricas?

Desde el MSDN:

La interfaz IEquatable (T) es utilizado por colección genérica objetos tales como Dictionary (TKey, TValue), la lista (T), y LinkedList (T) cuando se prueba por la igualdad en tales métodos como Contiene, IndexOf, LastIndexOf y Remove.

Si no implementa esa interfaz, ¿qué ocurre exactamente? ¿Excepción/objeto predeterminado es igual a/ref igual?

Respuesta

2

Aquí hay un ejemplo:

public class Foo : IEquatable<Foo> 
{ 
    public string Bar { get; set; } 

    public bool Equals(Foo other) 
    { 
     return string.Equals(other.Bar, Bar); 
    } 
} 

class Program 
{ 

    public static void Main(string[] args) 
    { 
     var foos = new List<Foo>(new[] 
     { 
      new Foo { Bar = "b1" }, 
      new Foo { Bar = "b2" }, 
      new Foo { Bar = "b3" }, 
     }); 

     var foo = new Foo { Bar = "b2" }; 
     Console.WriteLine(foos.IndexOf(foo)); // prints 1 
    } 
} 

Ahora comentar la implementación IEquatable<Foo> y ejecute el programa de nuevo.

+1

Intercalando que la respuesta aceptada en realidad no contiene la respuesta ...;) – Guffa

+0

@Guffa, a veces un ejemplo vale más que mil palabras. Por favor, no me malinterpreten, creo que su respuesta es excelente, explica claramente la teoría de cómo funciona 'IEtableta '. Es solo que cuando das un ejemplo con el que la gente puede jugar, pueden ver cómo funciona en la práctica. –

+0

¿Hay algún punto especial para omitir el resultado del ejemplo? – Guffa

4

Si no implementa la comparación de igualdad, se usará la implementación predeterminada.

Si la clave es un tipo de referencia, se utiliza la comparación de referencias. A menos que conserve los objetos clave para que pueda usarlos al recuperar elementos de la colección, se perderán. La creación de un nuevo objeto clave a partir de los mismos datos le proporciona un objeto con una referencia de diferencia, por lo que se perderá el elemento que está buscando.

1

Es un poco incorrecto decir que Dictionary<TKey,TValue> utiliza IEquatable<T> para comparar TKey valores. En realidad usa un IEquatilyComparer<T> para comparar valores.

Cuando uno no se proporciona explícitamente aunque usará EqualityComparer<TKey>.Default para generar el comparador. Esta propiedad estática tiene una heurística para determinar cuál es la mejor manera de comparar los valores de TKey. Si el tipo TKey implementa IEqutable<TKey>, se usará. Si no es así, recurrirá al método .Equals directamente.

Así que si no implementa IEquatable<T> y no proporciona una explicidad IEqualityComparer<T> entonces Dictionary<TKey,TValue> dependerá de .Equals normales.

Cuestiones relacionadas