J'ai une classe, afficher ci-dessous, qui est utilisée comme clé dans un dictionnaire Rechercher la clé J'utilise p>
égale code> et
gethascode code>.
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();
}
}
}
4 Réponses :
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é. P>
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. p>
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.
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 }
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 i> Je ne suis pas sûr de ce que je pensais.
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. p>
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. P>
Comment construisez-vous le dictionnaire? Passez-vous votre comparateur d'égalité personnalisé dans son constructeur? P>