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 :

Méthode Equals renvoie false ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 206
    Par défaut Méthode Equals renvoie false ?
    Bonjour à tous, j'aimerais savoir pourquoi, avec ce code, la méthode Equals me renvoie false. A part les références, je ne vois pas ce qui diffère entre ces deux objets, et je pensais que c'est la méthode ReferenceEquals qui comparent les références, pas Equals. Merci d'avance pour vos lumières

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    List<int> integerList = new List<int>();
    List<int> integerList2 = new List<int>();
    integerList.Add(1);
    integerList2.Add(1);
    Console.Out.WriteLine(integerList.Equals(integerList2));

  2. #2
    Invité
    Invité(e)
    Par défaut
    La méthode te renverra toujours False du fait que List<int> est un type référence donc ta classe List<int> n'implémentant pas ou du moins n'ayant pas rédéfinie la méthode Equals, elle utilisera la méthode du même nom de sa classe de base qui elle vérifie si les deux objets integerList et integerList2 partagent la même référence.

    Tu dois pour pouvoir renvoyer True dans ton cas actuel, créer une classe dérivant de List<int> et redéfinir (à ta propre sauce) la méthode Equals.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    L'implémentation par défaut de Equals teste l'égalité des références, et comme Equals n'est pas redéfinie dans List<T>, c'est ce qui est utilisé ici.

    Pour tester si deux listes sont "égales", tu peux utiliser la méthode d'extension SequenceEqual de Linq :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.Out.WriteLine(integerList.SequenceEqual(integerList2));
    (tient compte de l'ordre)

    Pour ne pas tenir compte de l'ordre, tu peux faire quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.Out.WriteLine(!integerList.Except(integerList2).Any());

  4. #4
    Invité
    Invité(e)
    Par défaut
    +1000.

    Je ne suis pas l'initiateur du thread mais j'ai remarqué qu'avec tes réponses, j'apprend toujours des trucs.

    J'étais parti, avec ma première réponse, créer une classe personnalisée dérivant de List<T> et redéfinissant la méthode Equals. Bref j'allais réinventer la roue quoi.

    Merci.

  5. #5
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Par défaut
    Tomlev : tout comme h2s84, quand j'ai vu la demande j'ai pensé à redéfinir Equals. Et tout comme h2s84, ta méthode à le mérite d'utiliser l'existant.
    Merci pour ce tuyau.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Au fait, pour que ça fonctionne, il faut que les éléments de la liste redéfinissent eux-même Equals, sinon ils sont comparés par référence. On peut aussi implémenter IEquatable<T>, ou encore fournir un IEqualityComparer<T> en paramètre de SequenceEqual ou Except

Discussions similaires

  1. Méthode execute() qui renvoie 'false'
    Par miabi dans le forum JDBC
    Réponses: 2
    Dernier message: 03/10/2011, 12h14
  2. Réponses: 6
    Dernier message: 04/05/2010, 10h18
  3. Automation Word : CreateDispatch renvoie FALSE
    Par Cram_N7 dans le forum C++
    Réponses: 1
    Dernier message: 12/03/2007, 17h27
  4. isset() me renvoie False
    Par pc.bertineau dans le forum Langage
    Réponses: 13
    Dernier message: 06/03/2007, 12h38
  5. Réponses: 12
    Dernier message: 23/03/2006, 14h13

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