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 :

Egalité entre 2 structures


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 62
    Points : 29
    Points
    29
    Par défaut Egalité entre 2 structures
    bonjour,
    j'ai à manipuler une structure qui se compose de Trois propriété
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    struct decision
        {
            public int[,] véhicule;
            public List<int>[,] arc;
            public List<int>[,] modéfication;
        }
    si je veux comparer 2 structure, comment je fasse???
    je doit parcourir chaque matrice et comparer ou il existe une méthode implémenter à utiliser directement???

  2. #2
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    On parle bien de deux "instances" de ton struct ?
    Il y a une méthode static Equals qui fait la comparaison. Mais je crois que tu devras la redéfinir pour qu'il effectue la comparaison membre par membre.

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    tu dois pouvoir overrider l'opérateur =, y mettre le code que tu veux qui sert à dire si une instance a les même valeur qu'une autre

  4. #4
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    tu dois pouvoir overrider l'opérateur =, y mettre le code que tu veux qui sert à dire si une instance a les même valeur qu'une autre
    Je crois que le terme exacte c'est overloader (surcharger), car l'override c'est pour les méthodes. Et il faut le faire sur l'opérateur == et non =

    Surcharge d'opérateur en C#

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 62
    Points : 29
    Points
    29
    Par défaut
    j'ai pas bien saisie
    est-ce que je doit sur charger l'opérateur= ou la methode equals???
    ou je dois implémenter une méthode pour la structure???

  6. #6
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Tu peux faire les deux, voire les trois :

    Tu peux avoir :
    Code c# : 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
     
    public static Boolean operator== (decision d1, decision d2) {
         if (d1.vehicle != d2.vehicucle)
               return false;
         if (!d1.arc.Equals(d2.arc)) 
               return false;
         if (!d1.modefication.Equals(d2.modefication)) 
               return false;
         return true;
    }
     
    public override Boolean Equals(decision d2) {
         if (this.vehicle != d2.vehicucle)
               return false;
         if (!this.arc.Equals(d2.arc)) 
               return false;
         if (!this.modefication.Equals(d2.modefication)) 
               return false;
         return true;
    }

    Les deux marcheront... (si je me suis pas planté... de tête c'est jamais acquis !)
    Tu peux vérifier ici : MSDN

  7. #7
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 62
    Points : 29
    Points
    29
    Par défaut
    merciiiiiiiiiiiiiii
    d1.arc est de type matrice dont les éléments sont des listes, je pense que je dois implémenter une méthode qui permet de verifier l'equalité???

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Points : 560
    Points
    560
    Par défaut
    je penses que oui, car si tu utilise if( liste1.Equals(liste2)) cela ne comparera pas le contenu mais simplement les "définitions" de tes listes.

    A vérifier !

  9. #9
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par emna hakem Voir le message
    merciiiiiiiiiiiiiii
    d1.arc est de type matrice dont les éléments sont des listes, je pense que je dois implémenter une méthode qui permet de verifier l'equalité???
    C'était juste à titre d'exemple, effectivement il faut peut-être que tu développes plus le contenu de l'égalité !

  10. #10
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Il me semblerait assez logique de definir l'opérateur == comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public static Boolean operator== (decision d1, decision d2) {
       return d1.Equals(d2);
    }
    Avoir une différence entre == et Equals est une subtilité que je n'ai jamais saisi ^^

  11. #11
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    En effet, s'il défini les deux ça n'a aucun intérêt de dupliquer le code...

    J'étais parti dans l'hypothèse où il pouvait n'en définir qu'un des deux, indépendamment de l'autre.

  12. #12
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Personnellement, je redéfinirai Equals et je laisserai == telquel.
    Mais je pense que c'est kif-kif...

  13. #13
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Bonjour

    Si on redéfinit Equals, l'usage est de redéfinir aussi GetHashCode pour s'assurer que si les deux instances de structure sont égales selon la définition de l'égalité que souhaite le développeur, il faut qu'elles retournent le même hashcode.

  14. #14
    Membre éclairé
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Points : 674
    Points
    674
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    Avoir une différence entre == et Equals est une subtilité que je n'ai jamais saisi ^^
    Je crois que IEqualityComparer (donc equals) est l'interface standard utilisée par le framework (genre dans des comparaisons faites avec linq, etc...)

  15. #15
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Bonjour

    Si on redéfinit Equals, l'usage est de redéfinir aussi GetHashCode pour s'assurer que si les deux instances de structure sont égales selon la définition de l'égalité que souhaite le développeur, il faut qu'elles retournent le même hashcode.
    GetHashCode, une méthode dont je me serts jamais... je n'ai même jamais réfléchi à ce que je pouvais en faire... bref connais pas

  16. #16
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Citation Envoyé par chrisdot Voir le message
    Je crois que IEqualityComparer (donc equals) est l'interface standard utilisée par le framework (genre dans des comparaisons faites avec linq, etc...)
    Tout à fait! L'opérateur == n'est par exemple pas utilisable dans le cas des generiques. Mais j'ai toujours pris l'habitude de faire o1==o2 et pas o1.Equals(o2)

  17. #17
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par kheironn Voir le message
    GetHashCode, une méthode dont je me serts jamais... je n'ai même jamais réfléchi à ce que je pouvais en faire... bref connais pas
    ce qui ne signifie aucunement que le framework ne l'utilise pas.

  18. #18
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Je ne dis pas le contraire... je vais d'ailleur profiter d'une charge basse pour m'y interresser et essayer de comprendre à quoi ça sert.

  19. #19
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Points : 560
    Points
    560
    Par défaut
    MSDN :

    Les classes dérivées qui substituent GetHashCode doivent également substituer Equals pour garantir que deux objets considérés comme égaux possèdent le même code de hachage ; sinon, il se peut que Hashtable ne fonctionne pas correctement.

  20. #20
    Membre éprouvé Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Points : 1 108
    Points
    1 108
    Par défaut
    Si j'ai bien compris cette page msdn
    pour la classe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Toto{
        Public Guid Id {get;set;}
        Public string Name {get;set;}
        [...]
        public override Guid GetHashCode ()
        {
            return this.Id
        }
    }
    retourner le guid serait un bon marqueur pour le Hashage ?

Discussions similaires

  1. Egalité entre deux champs NULL ?
    Par AyaGizmo dans le forum SQL
    Réponses: 2
    Dernier message: 08/06/2007, 11h42
  2. [XML] Choix entre différentes structures de fichier XML
    Par loic_86 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 21/02/2007, 05h39
  3. [C#] Diffèrence entre les structures et les classes
    Par Kr00pS dans le forum Windows Forms
    Réponses: 2
    Dernier message: 31/08/2006, 12h42
  4. .NET C# Egalité entre 2 instances
    Par mow dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/08/2006, 09h38
  5. [C++.NET] Egalite entre datatables
    Par raboin dans le forum VC++ .NET
    Réponses: 5
    Dernier message: 06/06/2006, 15h59

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