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 :

Probleme avec ArrayList


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 85
    Points : 71
    Points
    71
    Par défaut Probleme avec ArrayList
    Salut !

    J'ai un petit soucis avec un ArrayList. Je vous explique cela ( je tente ) , avant de vous exposé mon code.

    En gros j'ai un objet a , qui est dans une boucle. Comme les tableaux dynamique n'existent apparemment pas en C#, j'utilise un arraylist pour ajouter (Al.add() ) ce que contient mon objet dans ce dernier.

    Lors du premier passage dans la boucle, aucun soucis, lors du second passage, mon premier ajout est égale a mon second. Il y a de forte chance pour que si j'en ajouterai un troisieme de la même manière, les trois serais égaux ( au troiseme. )

    Le problème est pour moi tout repéré : mon ArrayList ne garde pas les "valeurs" de ce que je lui passe, mais ( sans doute ) la reference sur mon objet.

    Ma question est, Comment remédier à cela ?

    Code C# : 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
     
    //myAl est déclaré plus haut ainsi : ArrayList myAL = new ArrayList();
    XmlDocument XmlDoc = new XmlDocument();
    XmlNodeList element;
    CItem item=new CItem();
    // Item est une classe qui contient deux entiers et un char
    int i = 0;
    int id = 0;
    int temps = 0;
    char vtype='\0';
     
    XmlDoc.Load(path);
    element = XmlDoc.DocumentElement.GetElementsByTagName("variable");
     
    foreach (XmlNode node in element)
    {
        foreach (XmlNode childnode in node)
        {
            if (childnode.LocalName.Equals("id"))
                id = int.Parse(childnode.InnerText);
            else if (childnode.LocalName.Equals("type"))
                vtype = childnode.InnerText.ToCharArray()[0];
            else
                temps=int.Parse(childnode.InnerText);
        }
        item.setItem(id, vtype, temps);
        myAL.Add(item);
    }
     
    for (i = 0; i < myAL.Count;i++ )
         MessageBox.Show(myAL[i].ToString()); // affiche toujours le dernier lu, au lieu d'afficher tous ceux qui ont été lu.

    [EDIT] Je vous ajouter le fichier XML, ça sert à rien mais bon
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <config>
        <variable>
            <id>700</id> 
            <type>w</type> 
            <temps>5</temps> 
        </variable>
        <variable>
            <id>500</id> 
            <type>b</type> 
            <temps>7</temps> 
        </variable>
    </config>
    A bientot.

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Il faut recréer un objet de type CItem à chaque fois, ici tu gardes le même toujours, donc tu modifies les valeurs mais bon comme tu as une référence dans ta liste, tous les éléments de ta liste pointent sur le même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CItem item = new CItem(); // supprime le plus haut
        item.setItem(id, vtype, temps);
        myAL.Add(item);
    Les ArrayList c'est caca, mieux vaut utiliser les List génériques, List<CItem>.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 85
    Points : 71
    Points
    71
    Par défaut
    Je vais utiliser ta méthode, pour mon test, je me renseigne sur le list<> en parallèle

    Merci beaucoup

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 84
    Points : 61
    Points
    61
    Par défaut
    ce que tu ajoutes c le pointeur vers la valeur tu voix, alors chaque fois que tu change la valeur de item, ca chongera pour tous les valeurs de ta liste, alors essaye plus tot avec

    myAL.Add(new CItem(item));

    normalement ca devra marche

  5. #5
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par A0659 Voir le message
    Très bien je vais me renseigner sur les listes

    Merci à toi !
    Ben c'est le même principe sauf que une List<T> c'est typé, alors qu'un ArrayList ne l'est pas. Du coup avec List<T> tu as accès à des méthodes de recherche, de tri...
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 85
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par Hisoka_Hunter Voir le message
    myAL.Add(new CItem(item));
    En faisant de la sorte, je dois faire un nouveau constructeur, ou la programmation DotNet c'est tellement génial que j'ai même plus besoin de créer un constructeur par copie tout seul ?

  7. #7
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par A0659 Voir le message
    En faisant de la sorte, je dois faire un nouveau constructeur, ou la programmation DotNet c'est tellement génial que j'ai même plus besoin de créer un constructeur par copie tout seul ?
    Nan pas de constructeur pas copie tout seul.
    Je pense que le meilleur moyen est quand même de créer un objet à chaque fois plutôt que d'avoir un objet "global" que tu modifies et dont après tu fais une copie pour insérer dans ta liste.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 85
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par Skyrunner Voir le message
    Je pense que le meilleur moyen est quand même de créer un objet à chaque fois
    C'est ce que je fais grâce a ta méthode ça non ?

    Qu'appelles tu objet global?

  9. #9
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par A0659 Voir le message
    C'est ce que je fais grâce a ta méthode ça non ?

    Qu'appelles tu objet global?
    Oui c'est comme je t'ai montré.

    Global (c'est pour ça que je l'ai mis entre "), c'est juste comme ça que j'appelle ton objet item si tu t'en servais pour créer une autre instante de ta classe CItem à chaque fois. Global parce qu'en quelque sorte c'est un container pour tes autres objets.

    Bon cherche pas trop ça n'a pas d'explications dotnetique on va dire.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 85
    Points : 71
    Points
    71
    Par défaut
    OK merci pour tout, je classe en Résolu

  11. #11
    Membre du Club
    Inscrit en
    Avril 2003
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 100
    Points : 64
    Points
    64
    Par défaut
    J'ai aussi le meme probleme alors pour solutionner ca j'implémente une méthode Clone( ) pour chaque objet a mettre en liste...

    Je fais de la duplication....

    Qu'en pensez-vous ?
    "Un peu d'huile, de la viande, du broco et j'obtiens un bon BoeufBrocoli !"

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

Discussions similaires

  1. [Débutant] Probleme avec Arraylist
    Par elyaakoubi dans le forum VB.NET
    Réponses: 8
    Dernier message: 15/06/2011, 00h58
  2. probleme avec ArrayList
    Par Bigoodheart dans le forum Collection et Stream
    Réponses: 15
    Dernier message: 22/03/2010, 13h30
  3. probleme avec ArrayList
    Par guitariste dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 02/05/2008, 23h00
  4. probleme avec le changement dans une ArrayList
    Par Hisoka_Hunter dans le forum C#
    Réponses: 1
    Dernier message: 15/02/2008, 17h56
  5. [ArrayList] probleme avec add
    Par Magical dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 27/07/2007, 15h39

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