Sólo para que quede claro: Hay una cosa importante sobre Dictionary<TKey, TValue>
y GetHashCode()
: Diccionario utiliza GetHashCode para determinar si dos claves son iguales, es decir, si <TKey>
es de tipo personalizado que debe preocuparse por la implementación de GetHashCode()
cuidadosamente. Como Andrew Hare señaló, esto es fácil, si tiene un tipo simple que identifique su objeto personalizado sin ambigüedades. En caso de que tenga un identificador combinado, se vuelve un poco más complicado.
Como ejemplo, considere un número complejo como TKey
. Un número complejo está determinado por su real y su parte imaginaria. Ambos son de tipo simple, p. double
. Pero, ¿cómo identificarías si dos números complejos son iguales? Implementa GetHashode()
para su tipo complejo personalizado y combina ambas partes de identificación.
Encontrará más información sobre esta última here.
ACTUALIZACIÓN
Basado en el comentario de Ergwun he comprobado el comportamiento de Dictionary<TKey, TValue>.Add
con especial respeto a TKey
's ejecución de Equals(object)
y GetHashCode()
. I debo confesar que estaba bastante sorprendido por los resultados.
Dados dos objetos k1
y k2
de tipo TKey
, dos objetos arbitrarios v1
y v2
de tipo TValue
, y un diccionario vacío d
de tipo Dictionary<TKey, TValue>
, esto es lo que sucede cuando se añade v1
con llave k1
a d
primero y v2
con llave k2
segundos (dependiendo de la implementación de TKey.Equals(object)
y TKey.GetHashCode()
):
k1.Equals(k2) k1.GetHashCode() == k2.GetHashCode() d.Add(k2, v2)
false false ok
false true ok
true false ok
true true System.ArgumentException
Con clusion: estaba equivocado ya que originalmente pensé que el segundo caso (donde Equals
devuelve false
pero ambos objetos clave tienen el mismo código hash) elevaría un ArgumentException
. Pero como el tercer caso muestra el diccionario de alguna manera, usa GetHashCode()
. De todos modos, parece ser un buen consejo que dos objetos que son del mismo tipo y son iguales deben devolver el mismo código hash para garantizar que las instancias Dictionary<TKey, TValue>
funcionen correctamente.
posible duplicado de [¿Por qué es importante anular GetHashCode cuando se invalida el método Equals?] (Http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when- equals-method-is-overridden) – nawfal