Pregunta

Tengo una clase, que se muestra a continuación, que se utiliza como clave en un Dictionary < ValuesAandB, string > Tengo problemas al intentar encontrar cualquier clave dentro de este diccionario, nunca la encuentra en absoluto. Como puede ver, he anulado Equals y GetHashCode .

Para buscar la clave que estoy usando

ValuesAandB key = new ValuesAandB(A,B);
if (DictionaryName.ContainsKey(key)) {
   ...
}

¿Hay algo más que me falta? ¿Alguien puede señalar lo que estoy haciendo mal?

private class ValuesAandB {
   public string valueA;
   public string valueB;

   // Constructor
   public ValuesAandB (string valueAIn, string valueBIn) {
     valueA = valueAIn;
     valueB = ValueBIn;
   }

   public class EqualityComparer : IEqualityComparer<ValuesAandB> {
      public bool Equals(ValuesAandB x, ValuesAandB y) {
         return ((x.valueA.Equals(y.valueA)) && (x.valueB.Equals(y.valueB)));
      }
      public int GetHashCode(ValuesAandB x) {
         return x.valueA.GetHashCode() ^ x.valueB.GetHashCode();
      }
   }
}

¡Y antes de que alguien pregunte, sí, los valores están en el Diccionario!

¿Fue útil?

Solución

¿Cómo estás construyendo el diccionario? ¿Está pasando su comparador de igualdad personalizado a su constructor?

Otros consejos

No ha anulado Equals y GetHashCode. Ha implementado una segunda clase que puede servir como EqualityComparer. Si no construye el Diccionario con EqualityComparer, no se utilizará.

La solución más simple sería anular GetHashCode e Equals directamente en lugar de implementar un comparador (los comparadores generalmente solo son interesantes cuando necesita proporcionar varios tipos de comparación diferentes (mayúsculas y minúsculas, por ejemplo) o cuando necesita poder para realizar comparaciones en una clase que no controlas.

Parece que estás comparando dos cadenas. Iirc, cuando usa .Equals (), está comparando la referencia de las cadenas, no los contenidos reales. Para implementar un EqualityComparer que funciona con cadenas, querrás usar el método String.Compare ().

public class EqualityComparer : IEqualityComparer<ValuesAandB>
{
     public bool Equals(ValuesAandB x, ValuesAandB y)
     {
          return ((String.Compare(x.valueA,y.valueA) == 0) &&
            (String.Compare(x.valueB, y.valueB) == 0));
     }
     // gethashcode stuff here
}

Podría estar un poco loco con el código, eso debería acercarte ...

Tuve este problema, resulta que el diccionario estaba comparando referencias para mi clave, no los valores en el objeto.

Estaba usando una clase Point personalizada como claves. Anulé los métodos ToString () y GetHashCode () y viola, la búsqueda de claves funcionó bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top