IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Dictionary override Equals


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Dictionary override Equals
    Bonjour

    Je viens d'etre confronté a un petit souci que je n'avais pas encore appréhendé avec un Dictionary

    J'utilise la classe suivante comme clef d'un dictionaire


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      public class C_PointCosF
      {
        public PointF A;
        public PointF Acos;
        public C_PointCosF(PointF a)
        {
          this.A = a;
          this.Acos = C_BCGEO.PointFCos(A);
        }
      }
    J'ai malheureusement asser vite remarqué que ca ne marchait pas et que quand une clef n'était pas de type natif, il fallait overrider la methode Equals

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
      public class C_PointCosF
      {
        public PointF A;
        public PointF Acos;
        public C_PointCosF(PointF a)
        {
          this.A = a;
          this.Acos = C_BCGEO.PointFCos(A);
        }
        public override bool Equals(object obj)
        {
          C_PointCosF T=(C_PointCosF) obj;
          if (this.A.X == T.A.X && this.A.Y == T.A.Y)
          {
            return true;
          }
          return false;
        }
      }

    Mais ca ne marche pas mieux et maintenant il me dit que je dois aussi overrider la methode GetHashCode ce qui devient déja plus compliqué
    Du coup je me dis que ce que je voulais faire simplement avec un dictionnaire devient fort lourd. Ais-je loupé qq chose ?

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Le type utilisé pour la clé d'un dictionnaire doit forcément implémenter le code nécessaire pour tester l'égalité de deux instances, c'est un peu la base pour pouvoir utiliser un dictionnaire après tout.

    Après il y a deux façons de procéder :

    1. Tu implémente sur la classe utilisée comme clé l'interface IEquatable<T> (et derrière il faut redéfinir les méthodes Equals et GetHashCode pour que l'ensemble soit cohérent)
    2. Tu crées une classe pour effectuer la comparaison. Cette classe doit implémenter l'interface IEqualityComparer<T> et tu passes une instance de cette classe au constructeur du dictionnaire.

    La deuxième solution permet de déporter les redéfinitions de Equals et GetHashCode dans une autre classe (si jamais cela posait problème d'avoir tout dans la même) ou bien de proposer différentes comparaisons possibles pour la clé.

    Dans tout les cas tu devras définir les méthodes Equals et GetHashCode. Ces méthodes doivent alors retourner les mêmes valeurs pour des instances considérées comme égales, ce qui permet ensuite au dictionnaire de gérer les clés.

    Dans ton exemple, comme ton objet encapsule juste une instance de PointF, Equals et GetHashCode on juste à retourner le résultat des méthodes Equals et GetHashCode de PointF

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public class PointCosF : IEquatable<PointCosF>
    {
        public PointF A { get; private set; }
        public PointF Acos { get; private set; }
     
        public PointCosF(PointF a)
        {
            this.A = a;
            this.Acos = C_BCGEO.PointFCos(a);
        }
     
        public bool Equals(PointCosF other)
        {
            if (other == null)
            {
                return false;
            }
            else
            {
                return this.A.Equals(other.A);
            }
        }
     
        public override bool Equals(object obj)
        {
            return this.Equals(obj as PointCosF);
        }
     
        public override int GetHashCode()
        {
            return this.A.GetHashCode();
        }
    }

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci Stormimonn

    Effectivement ca semble evident mais c'est sans doute ma deformation du C qui m'avait laissé esperer une sorte de memcmp par défaut de l'objet

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/08/2011, 11h41
  2. Overrides de la methode "equals"
    Par docv266 dans le forum Langage
    Réponses: 4
    Dernier message: 14/11/2008, 19h03
  3. override equals dans une interface
    Par TheCaribouX dans le forum C#
    Réponses: 11
    Dernier message: 14/04/2008, 20h11
  4. Avantages de OnSomething / override
    Par Bruno75 dans le forum Langage
    Réponses: 7
    Dernier message: 20/10/2003, 19h49
  5. Problème d'override...
    Par NeoMan dans le forum Langage
    Réponses: 6
    Dernier message: 10/03/2003, 14h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo