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 :

[C#] Quelles explications sur Object.Equals()


Sujet :

C#

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 545
    Points
    545
    Par défaut [C#] Quelles explications sur Object.Equals()
    Voila, je voudrais comparer le contenu de 2 ArrayList qui ne contiennent que des valeurs de type byte.
    J'utilise donc la méthode Equals au lieu de l'opérateur == pour comparer le contenu plutôt que les références mais lorsque j'ai par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ArrayList list1 = new ArrayList();
    ArrayList list2 = new ArrayList();
    list1.Add(1);
    list2.Add(1);
    Debug.Assert(list1.Equals(list2));   // Assertion failed
    j'ai donc list1.Equals(list2) qui renvoie false, je ne comprends pas puisque je pensais que Equals comparait les valeurs et non pas les références ....
    Si quelqu'un pouvait m'expliquer, je suis preneur.

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Je sais pas trop, en tout cas ArrayList.Equals est hérité de Object, mais pas redéfinis : c'est donc les instances qui sont comparées et non pas les valeurs de la collection.

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 545
    Points
    545
    Par défaut
    Citation Envoyé par smyley
    Je sais pas trop, en tout cas ArrayList.Equals est hérité de Object, mais pas redéfinis : c'est donc les instances qui sont comparées et non pas les valeurs de la collection.
    Oui, mais je pensais que le reflexion était utilisée justement pour pouvoir comparer les champs de type valeur.

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    j'ai vérifié avec Reflector et d'après ce que j'ai pu constater ArrayList.Equals <=> Object.Equals, donc standard, pas de comparaison des valeurs

  5. #5
    Membre habitué Avatar de del-dongo
    Inscrit en
    Mai 2003
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 147
    Points : 183
    Points
    183
    Par défaut
    de manière générale,

    pour les types valeurs :
    Equals compare les valeurs
    == compare les valeurs

    pour les types références :
    Equals compare les références
    == compare les références

    ceci est le compartement par défaut, si l'on veut que pour un type référence la méthode Equals compare l'ensemble des propriétés de la classe alors il faut surcharger la méthode Equals. (ici tes 2 instances d'arraylist ne référencent pas le même objet donc Equals renvoie faux...)


  6. #6
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Effectivement comme te le dit très justement smyley, ce n'est pas parce que deux collections contiennent les mêmes objets qu'elles sont les mêmes. Il te faut dans ton cas redefinir la méthode Equals en la surchargeant sur une classe perso dérivée de ArrayList; cependant pourquoi ne pas alors faire ta propre ByteCollection
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Pour une collection de Byte, il vaut mieux utiliser System.Collections.Generic.List<T>

    J'ai constaté après essai que les comparaisons entre types natifs sont juste deux fois plus rapides que les comparaisons entre les même valeurs sous forme d'objets (boxing).

    Méthodes de comparaison :
    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
    //comparaison de List<int>
    static bool IsListDifferent(List<int> list1, List<int> list2) {
        for (int i = list1.Count - 1; i >= 0; i--) {    //petite optimisation sur la lecture de list1.Count
        //for (int i = 0; i < list1.Count; i++) {
            //comparaison par !=
            if (list1[i] != list2[i]) return true;
            }
        return false;
        }
    //comparaison de ArrayList
    static bool IsArrayListDifferent(ArrayList arrayList1, ArrayList arrayList2) {
        for (int i = arrayList1.Count - 1; i >= 0; i--) {
        //for (int i =  0; i <arrayList1.Count; i++) {
            //comparaison par Object.Equals()
            if (!arrayList1[i].Equals(arrayList2[i])) return true;
            }
        return false;
        }
    Code d'essai :
    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
    34
    //créer des listes à comparer
    int nbItems = 1000000;
    List<int> list1 = new List<int>(nbItems);
    List<int> list2 = new List<int>(nbItems);
    ArrayList arrayList1 = new ArrayList(nbItems);
    ArrayList arrayList2 = new ArrayList(nbItems);
    //remplir les listes
    for (int i = 0; i < nbItems; i++) {
        list1.Add(i);
        list2.Add(i);
        arrayList1.Add(i);
        arrayList2.Add(i);
        }
     
    //réaliser les essais de comparaison
    Stopwatch watch = new Stopwatch();
    int nbEssais = 50;
    long[] dureeCompList = new long[nbEssais];
    for (int i = 0; i < nbEssais; i++) {
        watch.Reset();
        watch.Start();
        bool diff = IsListDifferent(list1, list2);
        watch.Stop();
        dureeCompList[i] = watch.ElapsedMilliseconds;
        }
    long[] dureeCompArrayList = new long[nbEssais];
    for (int i = 0; i < nbEssais; i++) {
        watch.Reset();
        watch.Start();
        bool diff2 = IsArrayListDifferent(arrayList1, arrayList2);
        watch.Stop();
        dureeCompArrayList[i] = watch.ElapsedMilliseconds;
        }
    //regarder les résultats (en ms) dans dureeCompList et dureeCompArrayList
    On ne peut pas faire boire un âne qui n'a pas soif.

  8. #8
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    +1 NicolasG, si effectivement notre ami possède le framework 2.0
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Citation Envoyé par neguib
    +1 NicolasG, si effectivement notre ami possède le framework 2.0
    Y'a pas de raison de s'en priver, il est gratuit
    On ne peut pas faire boire un âne qui n'a pas soif.

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    Points : 545
    Points
    545
    Par défaut
    Non, pour l'instant je suis limité au Framework 1.1 mais les réponses me suffisent.
    Merci.

  11. #11
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    A noter qu'avec List<T> (sûrement avec d'autres collections également), il est possible de d'implémenter, pour T l'interface IEquatable<T>, et dans ce cas, les tests d'égalité de nombreuses méthodes de List<T> (comme contains, add...) se feront sur l'implémentation de la méthode Equals de l'interface IEquatable<T>.

    C'est très pratique si on souhaite une liste sans doublons, par exemple.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par NicolasG
    Y'a pas de raison de s'en priver, il est gratuit
    Mais sans rien pour faire le code, c'est tout de suite plus dur
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Citation Envoyé par Maniak
    Mais sans rien pour faire le code, c'est tout de suite plus dur
    Notepad est un peu limité mais sinon on peut toujours utiliser Visual Studio 2005 Express, c'est aussi gratuit.
    On ne peut pas faire boire un âne qui n'a pas soif.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par NicolasG
    Notepad est un peu limité mais sinon on peut toujours utiliser Visual Studio 2005 Express, c'est aussi gratuit.
    et comment on y installe Resharper et VAssistX ?
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Citation Envoyé par Maniak
    et comment on y installe Resharper et VAssistX ?
    Je n'en sais rien, je ne les utilise pas
    Mais tu n'est pas du genre à poser une question sans connaître la réponse à l'avance
    On ne peut pas faire boire un âne qui n'a pas soif.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par NicolasG
    Je n'en sais rien, je ne les utilise pas
    Mais tu n'est pas du genre à poser une question sans connaître la réponse à l'avance
    Vi, on ne peut pas. VS Express ne permet pas d'installer le moindre plugin

    (par contre, profite de la fin de la période de dév de Resharper pour essayer la v2, tu verras, tu ne t'en passeras plus

    (ok c'est du hors sujet, j'arrête
    Be wary of strong drink.
    It can make you shoot at tax collectors, and miss.

  17. #17
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    J'ai essayé resharper 2 et VassistX. J'aime pas tellement, personnellement.
    Y'a certains trucs qui sont vraiment chouettes mais d'autres qui me plaisent vraiment pas du tout dans ces deux plugins

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

Discussions similaires

  1. [Toutes versions] explication sur l'object scriptcontrol
    Par patricktoulon dans le forum Macros et VBA Excel
    Réponses: 43
    Dernier message: 10/07/2015, 13h45
  2. Explication sur List(Of Object).IndexOf(Object)
    Par Zakapatul dans le forum VB.NET
    Réponses: 2
    Dernier message: 01/12/2008, 15h55
  3. s.v.p :explication sur le ".h" et dll de l'opengl
    Par Asmod_D dans le forum OpenGL
    Réponses: 1
    Dernier message: 22/11/2004, 10h32
  4. Réponses: 28
    Dernier message: 18/08/2003, 11h54
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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