2012-04-04 20 views
12

tengo un diccionario que está adaptada de una lista:C# de lista como diccionario clave

private Dictionary<List<custom_obj>, string> Lookup; 

Estoy intentando utilizar ContainsKey, pero no parece estar funcionando, y no tengo ni idea de por qué . Aquí está la información de depuración de mi ventana de Visual Studio inmediata:

?Lookup.Keys.ElementAt(7)[0] 
{custom_obj} 
    Direction: Down 
    SID: 2540 
?Lookup.Keys.ElementAt(7)[1] 
{custom_obj} 
    Direction: Down 
    SID: 2550 
searchObject[0] 
{custom_obj} 
    Direction: Down 
    SID: 2540 
searchObject[1] 
{custom_obj} 
    Direction: Down 
    SID: 2550 
?Lookup.ContainsKey(searchObject) 
false 

En mi sentido común, que el pasado ContainsKey debe ser verdad. Espero haber incluido suficiente información aquí ... ¿Alguna idea?

Gracias!

Respuesta

14

La instancia de List<custom_obj> que actúa como clave es referencialmente desigual a la instancia referida por searchObject.

Si desea utilizar el diccionario para los valores de la lista en lugar de la igualdad de referencia para encontrar las llaves a juego, debe proporcionar un IEqualityComparer en el constructor del diccionario (ya que no puede anular iguales y GetHashCode en List<T>).

3

Esto solo funcionará si la instancia de lista real utilizada en la búsqueda es la misma que la instancia que se agregó como clave. No comparará los contenidos de la lista. Este es el mismo comportamiento que obtendrá si intenta comparar dos objetos List directamente.

8

Tiene dos List s separados que contienen los mismos elementos. La forma correcta de averiguar si dos listas son iguales es con el método SequenceEqual.

No puede hacer de manera predeterminada lo que está tratando de hacer. Sin embargo, puede escribir un IEqualityComparer personalizado y pasarlo al constructor Dictionary.

Este es un ejemplo genérico IEqualityComparer:

class ListComparer<T> : IEqualityComparer<List<T>> 
{ 
    public bool Equals(List<T> x, List<T> y) 
    { 
     return x.SequenceEqual(y); 
    } 

    public int GetHashCode(List<T> obj) 
    { 
     int hashcode = 0; 
     foreach (T t in obj) 
     { 
      hashcode ^= t.GetHashCode(); 
     } 
     return hashcode; 
    } 
} 

Es posible que desee mejorar en la implementación GetHashCode, ya que esta era una solución rápida y sucia.

+0

GetHashCode no se encuentra. –

+0

Nota rápida: como se insinúa la respuesta, no debe usar este Comparer. El método equals es sensible al orden pero el método hash no. –

0

¿Está seguro de que la instancia que está utilizando en su método de búsqueda es la misma instancia que está entre las claves de su diccionario? Eso es lo único que se me ocurre.

Cuestiones relacionadas