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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    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 confirmé
    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
    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 éclairé

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 162
    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 confirmé
    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
    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 expérimenté Avatar de del-dongo
    Inscrit en
    Mai 2003
    Messages
    147
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 147
    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 confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    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

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    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

+ 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