10
votes

Classe personnalisée utilisée comme clé dans le dictionnaire mais clé non trouvée

J'ai une classe, afficher ci-dessous, qui est utilisée comme clé dans un dictionnaire code> J'ai des problèmes lorsque vous essayez de trouver une clé dans ce dictionnaire, il ne le trouve jamais du tout. Comme vous pouvez le constater, j'ai remplacé égale code> et gethascode code>.

Rechercher la clé J'utilise p>

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


0 commentaires

4 Réponses :


7
votes

Vous n'avez pas remplacé les égaux et GetHashCode. Vous avez mis en place une deuxième classe qui peut servir d'équité. Si vous ne construisez pas le dictionnaire avec le compromisier, il ne sera pas utilisé.

La solution la plus simple consisterait à remplacer GetHashCode et est égale directement plutôt que de mettre en œuvre un comparateur (les comparateurs ne sont généralement intéressants que lorsque vous devez fournir plusieurs types de comparaison différents (sensible à la casse et insensible à la casse, par exemple) ou lorsque vous devez être capable. effectuer des comparaisons sur une classe que vous ne contrôlez pas.


1 commentaires

Oui, des commentaires prises à bord et la bonne réponse telle qu'elle s'est avérée, mais Greg Beech a eu l'avance de vous avoir peur. Merci pour l'aide en tout cas.



0
votes

On dirait que vous comparez deux chaînes. IIRC, lors de l'utilisation de .Quelques (), vous comparez la référence des chaînes, pas du contenu réel. Pour mettre en place un équipement d'équité qui fonctionne avec des chaînes, vous voudriez utiliser la méthode stress.cacher ().

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
}


2 commentaires

Non, String.equals (String) est la surcharge qui sera appelée ici, ce qui compare très explicitement le contenu. Et dans tous les cas, String.equals (objet) est remplacé pour faire de même.


FacePalm Je ne suis pas sûr de ce que je pensais.



1
votes

J'ai eu ce problème, ce qui s'avère que le dictionnaire comparait des références pour ma clé, pas les valeurs de l'objet.

J'utilisais une classe de points personnalisée comme des clés. Je remplace les méthodes de Tostring () et de GethashCode () et de Viola, la recherche clé a fonctionné bien.


0 commentaires

9
votes

Comment construisez-vous le dictionnaire? Passez-vous votre comparateur d'égalité personnalisé dans son constructeur?


0 commentaires