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 :

Comment comparer la valeur de deux objets (type Object) [Débutant]


Sujet :

C#

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut Comment comparer la valeur de deux objets (type Object)
    Bonjour,

    je voudrais écrire une fonction qui compare le contenu de deux objets. Je voudrais faire quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bool AreEquals(Object left, Object right)
    {
       return (left == right);
    }
     
    void Test()
    {
       bool b1 = true;
       bool b2 = true;
       bool result = AreEquals(b1, b2);
    }
    Le problème c'est que, dans le code ci-dessus, il compare les deux objets, et pas leur valeur. Donc result vaudra "false", alors que moi je voudrais qu'il soit "true", puisque les valeurs de b1 et de b2 sont identiques.

    Alors j'ai essayé de caster mes objets de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool AreEquals(Object left, Object right)
    {
       return ( (left.GetType()) left == (right.GetType()) right );
    }
    Mais ça ne compile pas: cannot implicitely convert type 'System.Type' to 'bool'
    Et je ne parviens pas à comprendre quel est le problème. Je ne parviens pas non plus à trouver d'autres solutions. J'ai cherché du côté de Activator.CreateInstance(), mais je ne parviens pas à l'utiliser. J'ai l'impression que c'est une mauvaise piste.

    Auriez-vous des idées?


    Note: La raison pour laquelle j'ai besoin de faire ceci, c'est que je récupère dynamiquement les propriétés d'instances de classes via quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PropertyInfo myProperty = myObject.GetPropertiy("property name")
    et j'accède ensuite à la valeur de la propriété via myProperty.GetValue() qui me renvoie un objet de type Object.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Le meilleur moyen c'est d'utiliser la classe EqualityComparer<T>. Elle permet de définir comment comparer 2 objets (par exemple comparer la propriété A de chacun des objets).
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    merci pour ta réponse

    Cela dit, je ne comprends pas bien comment la class EqualityComparer peut m'aider. En effet, EqualityComparer est une classe générique qui nécessite un type statique. Or dans mon cas, je n'ai jamais le type statique, je n'ai que le type dynamique via GetType().

    En revanche, je pense avoir trouvé la solution. C'était visiblement trop évident alors je ne l'ai pas vu. Au lieu de faire objet1 == objet2, je fais objet1.Equals(objet2). Je n'ai pas encore compris la différence (je vais me renseigner), et je ne suis pas encore bien conscient des risques de cette méthode, mais à première vue ça semble fonctionner.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    == est un opérateur et comme tout opérateur il est défini comme membre statique de la classe ; par conséquent c'est le type "statique" (type de la variable) qui définit quelle méthode/opérateur est utilisée. (et pour object, == compare juste les références)
    Equals est une méthode virtuelle définie comme membre d'instance ; par conséquent le polymorphisme s'applique et c'est le type "dynamique" (type du contenu de la variable) qui définit quelle version est utilisée. (et donc en reprenant ton exemple avec des bool, Equals se retrouve à utiliser cette méthode)
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  5. #5
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Merci pour ces précisions
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par r0d Voir le message
    Cela dit, je ne comprends pas bien comment la class EqualityComparer peut m'aider.
    Effectivement j'ai lu ton post initial en diagonale et suis passé à côté du fait que tu utilisais des objects...
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

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

Discussions similaires

  1. [C#] Comparer les valeurs de deux listes d'objets
    Par pitipilot dans le forum C#
    Réponses: 12
    Dernier message: 08/12/2014, 11h59
  2. Réponses: 2
    Dernier message: 21/03/2013, 18h38
  3. comparer les valeurs de 2 objets de même type
    Par laurent12345 dans le forum C#
    Réponses: 4
    Dernier message: 19/03/2012, 15h48
  4. comment comparer les valeurs retournés par DBGrid
    Par Ice-tea dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/06/2006, 14h42
  5. Réponses: 17
    Dernier message: 31/12/2005, 21h32

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