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 :

ArrayList.Contains() et equals d'objets


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Points : 103
    Points
    103
    Par défaut ArrayList.Contains() et equals d'objets
    J'essaye d'utiliser la méthode ArrayList.Contains() mais je ne comprends pas pourquoi cette méthode ne renvoie pas true sur deux objets égaux (j'entend par la deux objets ayant une référence différente mais un contenu identique).

    Je ne sais pas si je suis très clair, donc voilà ce que ca donne. J'ai une classe Days :
    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
     
    public class Days
        {
            int wkDay;
            Rectangle dayRect;
     
            public Days(Rectangle rect, int d)
            {
                dayRect = rect;
                wkDay = d;
            }
     
            public Rectangle DayRect
            {
                get { return dayRect; }
            }
     
            public int WkDay
            {
                get { return wkDay; }
            }
        }
    Je crée plusieurs instances de cette classe que je stocke dans une ArrayList nommée selectedDays. Je stocke également plusieurs instances de cette classe dans un tableau à deux dimensions nommé monthDays.

    Je parcours ensuite l'intégralité de mon tableau et vérifie si chacun des éléments qu'il contient existe déjà dans mon ArrayList SelectedDays, pour cela j'utilise la méhode Contains() de mon ArrayList, le code de parcours de mon tableau avec la comparaison des deux instances de Days :

    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
     
     for (int i = 0; i <= 5; i++)
                {
                    for (int j = 0; j <= 6; j++)
                    {
                        Rectangle rect = new Rectangle(xPos, yPos, colWidth, lineHeight);
                        g.DrawRectangle(new Pen(gridBorderColor), xPos, yPos, colWidth, lineHeight); 
                        monthDays[i, j] = new Days(new Rectangle(xPos, yPos, colWidth, lineHeight), firstWeekOfMonth[j].Day);
     
                        if (selectedDays.Contains(monthDays[i,j]))
                        {
                             g.FillRectangle(new SolidBrush(Color.FromArgb(selectedDayBgColorAlpha, selectedDayBgColor)), rect);
                        }
                        else
                        {
                            g.FillRectangle(new SolidBrush(dayBgColor), rect);
                        }
                        g.DrawString(firstWeekOfMonth[j].Day.ToString(), dayNumberFont, new SolidBrush(dayNumberColor), rect);
     
                        xPos += colWidth;
                    }
                    if (xPos + colWidth > Width)
                    {
                        yPos += lineHeight;
                        xPos = 0;
                    }
                    for (int j = 0; j <= firstWeekOfMonth.Length - 1; j++)
                    {
                        firstWeekOfMonth[j] = firstWeekOfMonth[j].AddDays(7);
                    }
                }
    C'est la ligne if (selectedDays.Contains(monthDays[i,j])) qui me pose problème car lors d'un debug en pas a pas selectedDay contient bien une instance de Days ayant exactement le même contenu que l'instance de Days dans monthDays[i,j], pourtant SelectedDays.Contains() me renvoie false... pourquoi ? normalement cela équivaut à un équals non ? cela voudrait donc dire que c'est bien les contenus qui sont comparés et non les référence donc pourquoi ce false...

    Merci de votre aide

  2. #2
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    La méthode Contains fait un test par référence, c pour cela que ça ne fonctionne pas.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Salut,

    ArrayList.Contains compare les références des objets en cas d'absence d'override de la méthode Equals.

    Pour toi les deux objets sont égaux car ils ont les mêmes valeurs, mais pour .Net ils sont différents car la référence de l'objet (en mémoire) n'est pas la même.

    Pour résoudre ton problème, il faut faire un override de Equals pour tester l'égalité des champs.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par cybermaxs Voir le message
    Salut,

    ArrayList.Contains compare les références des objets en cas d'absence d'override de la méthode Equals.
    Effectivement, je ne sais pas pourquoi mais j'étais persuadé que Equals comparait les valeurs et non les références...tellement persuadé que je n'ai même pas vérifié... c'est on ne peut plus clair sur msdn : http://msdn.microsoft.com/fr-fr/libr....contains.aspx
    http://msdn.microsoft.com/fr-fr/library/bsc2ak47.aspx
    http://msdn.microsoft.com/fr-fr/libr...8VS.80%29.aspx

    J'en ai marre d'être un boulet parfois pardonnez-moi mon dieu parce que j'ai péché

    En tout cas merci.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Points : 103
    Points
    103
    Par défaut
    Par contre j'ai un petit problème pour redéfinir la méthode Equals() (override) j'ai cherché des infos sur le net et chaque fois cette méthodes est redéfinie dans une classe héritant de system.object... hors ici je souhaites redéfinir la méthode Equals appeler par Arraylist.Contains()... j'ai un problème, je ne sais pas comment faire, je pense que je ne suis pas encore assé familiarisé avec la phylosophie objet... une piste ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    une solution ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            public override bool Equals(object obj)
            {
                Days item = obj as Days;
                if (item == null)
                {
                    return false;
                }
                return this.WkDay.Equals(item.WkDay) && this.DayRect.Equals(item.DayRect);
            }

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Points : 103
    Points
    103
    Par défaut
    j'ai tout à fait compris le principe concernant le contenu de la méthode Equals(). Ce que je ne comprenait pas c'est comment la méthode Equals redéfinie va pouvoir être appelée à partir de la méthode Contains() qui elle ne l'est pas. Vue que tu ne précise rien je suppose que ca doit se faire naturellement si je puis dire... il va falloir que je revois une énième fois (le mot est faible) le fonctionnement de tout ça car j'ai du rater un truc...

    Bon bah en attendant merci je vais faire un test !

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Citation Envoyé par koktel_dfr Voir le message
    Vue que tu ne précise rien je suppose que ca doit se faire naturellement si je puis dire... il va falloir que je revois une énième fois (le mot est faible) le fonctionnement de tout ça car j'ai du rater un truc...

    Bon bah en attendant merci je vais faire un test !
    Oui en effet, c'est fait en interne. Sans la doc msdn et un peu d'expérience, tu ne peux pas le savoir.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Points : 103
    Points
    103
    Par défaut
    Bon et bien ca fonctionne nickel !!!

    Le problème avec la doc msdn c'est qu'aussi bien certaines parties sont très claires, même pour un débutant aussi bien d'autres parties sont beaucoup plus compliquées... ca ne fait pas longtemps que je fais régulièrement du C# meme si j'ai écrit mon premier "hello word" il y a un moment de cela... et parfois je suis largué avec msdn, les tutos sur le net me paraissent souvent plus clairs sur certaines notions complexes.

    Dans le genre complexe j'ai vue dans msdn que quand on redéfinissait la méthode Equals() il fallait également redéfinir GetHashCode()... et bien moi normal je suis aller jeter un oeil à GetHashCode() sur msdn http://msdn.microsoft.com/fr-fr/libr...thashcode.aspx he bien très franchement il va falloir que je me colle bien le nez dedans car pour le moment ca me parait incompréhensible... enfin pour le moment ma méthode redéfinie ne fait que renvoyer l'entier 1 car je n'ai pas encore compris ce qu'elle était censé renvoyer...

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    je n'ai pas encore compris ce qu'elle était censé renvoyer...
    il faut qu'elle renvoie un entier unique. L'idée est de faire une composition des membres de ta classe, un peu comme pour Equals.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 182
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par cybermaxs Voir le message
    L'idée est de faire une composition des membres de ta classe, un peu comme pour Equals.
    Une composition des membres de ma classe ? qu'entends-tu par composition ? J'ai bien compris qu'il fallait qu'elle renvoie un int, c'est pourquoi pour le moment je ne fais que renvoyer l'entier 1 mais je ne vois pas ce que je pourrais lui faire renvoyer d'utile ni quelle est l'intérêt ce cette méthode GetHashCode().

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

Discussions similaires

  1. object.equals et arraylist.contains ne marche pas
    Par bobby51 dans le forum Windows Forms
    Réponses: 0
    Dernier message: 10/03/2009, 10h36
  2. ArrayList accès propriété de l'objet
    Par missmarion dans le forum C#
    Réponses: 4
    Dernier message: 29/05/2007, 09h35
  3. Equals dans objet remote: Identity/ServerIdentity cast exception
    Par joebarthib dans le forum Windows Forms
    Réponses: 1
    Dernier message: 13/02/2007, 14h20
  4. Equals d'objets recursif
    Par Shiftane dans le forum Langage
    Réponses: 14
    Dernier message: 20/06/2006, 10h50
  5. [Débutant][ArrayList]parcours et recherche d'objets
    Par codexomega dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/02/2006, 18h14

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