2012-06-11 24 views
5
// No overrides required .. let CLR take care of equal and hashcode. 
Class Foo {public Name{get; set;} public Address{get; set;}} 

Dictionary<List<Foo>, int> map = new Dictionary<List<Foo>, int>(); 

Pregunta:¿Puedo usar la Lista de objetos como claves del diccionario?

¿Es este código se ven bien? Entiendo que para ser una clave en el mapa, Foo necesita anular los métodos equals y hashcode: anula ambos o ninguno.

Me preguntaba ¿qué pasa con la Lista de objetos como claves? ¿Qué significa igualdad cuando se trata de List? es el mapa definido anteriormente seguro del problema "objeto perdido en el mapa"?

-Karephul

Respuesta

3
List<int> a = new List<int>(1, 2, 3); 
List<int> b = new List<int>(1, 2, 3); //different instance than a 

Dictionary<List<int>, int>> map = new Dictionary<List<int>, int>>(); 
map.Add(a, a.Sum()); 
int aSum = map[b]; //KeyNotFoundException because this is a different instance. 


HashSet<int> a = new HashSet<int>(1, 2, 3); 
HashSet<int> b = new HashSet<int>(1, 2, 3); //different instance than a 

Dictionary<HashSet<int>, int>> map1 = new Dictionary<HashSet<int>, int>>(); 
map1.Add(a, a.Sum()); 
int aSum = map1[b]; //KeyNotFoundException because this is a different instance. 


HashSet<int> a = new HashSet<int>(1, 2, 3); 
HashSet<int> b = new HashSet<int>(1, 2, 3); //different instance than a 

Dictionary<HashSet<int>, int>> map2 = new Dictionary<HashSet<int>, int>> 
    (HashSet<int>.CreateSetComparer()); //instance comparison not used - equal sets are equal 
map2.Add(a, a.Sum()); 
int aSum = map2[b]; //6 
+0

+ 1 por ejemplos – karephul

5

Esto sólo funcionará si utiliza los List<T> casos originales como claves.
Si crea un nuevo List<T> con los mismos elementos, no se tratará como la misma clave, ya que List<T> no anula Equals() y GetHashCode().

En otras palabras, utilizará igualdad de referencia.

Si desea cambiar eso, puede escribir un IEqualityComparer<List<T>>.

+0

+ 1 por buena respuesta. – karephul

0

Claro, usted podría , pero eso sería muy limitado. En pocas palabras, una lista de una combinación de Foo, incluso si los elementos de la lista son todos iguales Foo, no es necesariamente el mismo List<Foo>. Por lo tanto, deberá mantener las referencias en un lugar no ambiguo para asegurarse de que la clave sea la misma o realizar una función de coincidencia de teclas complicada.

Sería mucho, ahora mejor simplemente use un tipo de llave mejor.

Cuestiones relacionadas