Domanda

Ho una classe, mostra sotto, che viene utilizzata come chiave in un Dictionary<ValuesAandB, string> Sto riscontrando problemi quando provo a trovare una chiave in questo dizionario, non la trova mai. Come puoi vedere, ho ignorato Equals e GetHashCode.

Per cercare la chiave che sto usando

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

C'è qualcos'altro che mi manca? Qualcuno può sottolineare cosa sto facendo di sbagliato?

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();
      }
   }
}

E prima che qualcuno chieda, sì, i valori sono nel Dizionario!

È stato utile?

Soluzione

Come stai costruendo il dizionario? Stai passando il tuo comparatore di uguaglianza personalizzato al suo costruttore?

Altri suggerimenti

Non hai sostituito Equals e GetHashCode. È stata implementata una seconda classe che può fungere da EqualityComparer. Se non costruisci il dizionario con EqualityComparer, non verrà utilizzato.

La soluzione più semplice sarebbe quella di sovrascrivere GetHashCode e Equals direttamente anziché implementare un comparatore (i comparatori sono generalmente interessanti solo quando è necessario fornire più tipi di confronto diversi (maiuscole e minuscole, ad esempio) o quando è necessario essere in grado per eseguire confronti su una classe che non controlli.

Sembra che tu stia confrontando due stringhe. Iirc, quando si utilizza .Equals (), si confronta il riferimento delle stringhe, non il contenuto effettivo. Per implementare un EqualityComparer che funziona con le stringhe, si desidera utilizzare il metodo 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
}

Potrei essere un po 'fuori con il codice, che dovrebbe avvicinarti ...

Ho avuto questo problema, risulta che il dizionario stava confrontando i riferimenti per la mia chiave, non i valori nell'oggetto.

Stavo usando una classe Point personalizzata come chiavi. Ho ignorato i metodi ToString () e GetHashCode () e viola, la ricerca dei tasti ha funzionato bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top