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 :

Modifier un élément dans une liste


Sujet :

C#

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

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Modifier un élément dans une liste
    Bonjour à tous !

    J'ai un petit souci avec une liste C#. J'ai regardé sur le forum mais je n'ai pas trouvé de sujet qui parlait de mon problème. Alors soit c'est vraiment trop simple et je passe à coté d'un truc bateau, soit j'ai mal cherché lol. Dans tout les cas, pouvez vous m'aider svp.

    Voici mon code :
    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
     
        class Particles
        {
            public struct Particle
            {
                public int x;
                public int y;
                public float p;
            }
     
            public List<Particle> myBel = new List<Particle>();
     
     
            public void moveParticles(int dx, int dy)
            {
                foreach (Particle a in myBel)
                {
                    a.x += dx;
                    a.y += dy;
                }
     
            }
    }
    mais j'ai une méchante erreur qui me dit que "Impossible de modifier les membres de 'a', car il s'agit d'un 'variable d'itération foreach". Quelle est la solution dans ce cas la ?

    Merci d'avance !

  2. #2
    Membre habitué Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Points : 156
    Points
    156
    Par défaut
    salut,

    je suis pas sur de savoir quelle est le problème, mais ça se peut se résoudre de 2 manières:
    - soit par une class plutôt qu'une struct.
    - soit en passant une variable temporaire.

    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
    35
    36
    37
    38
    39
    40
    41
     
    class Particles
        {
            public class Particle
            {
                public int x;
                public int y;
                public float p;
            }
     
            public struct Particle2
            {
                public int x;
                public int y;
                public float p;
            }
     
            public List<Particle> myBel = new List<Particle>();
            public List<Particle2> myBel2 = new List<Particle2>();
     
            public void moveParticles(int dx, int dy)
            {
                foreach (Particle a in myBel)
                {
                    a.x += dx;
                    a.y += dy;
                }
            }
     
            public void moveParticles2(int dx, int dy)
            {
     
                for (int i = 0; i < myBel2.Count; i++)
                {
                    Particle2 tmp = myBel2[i];
                    tmp.x += dx;
                    tmp.y += dy;
                    myBel2[i] = tmp;
                }
            }
        }

  3. #3
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    En complement de la solution apportee par thelpi : pour avoir comment se comporte une struct, suffit de remplacer ta struct par "int", ce qui donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    foreach(int i in maListedEntiers)
      i += 2;
    qui, meme si le compilo l'acceptait ne modifierait pas la liste.

    Le plus simple, c'est que tu fasses une fonction MoveParticle dans ta struct (qui renvoie une nouvelle struct), et tu pourras ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (int i = 0 ; i < taliste.Count ; i++)
      taListe[i] = taListe[i].move(dx, dy);

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

    Informations forums :
    Inscription : Février 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Ooooh super, la sulotion de la classe est simple et marche a merveille. Merci beaucoup !!

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2002
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 104
    Points : 128
    Points
    128
    Par défaut
    Je me permets d'ajouter un conseil :
    Se renseigner sur la différence entre les types "valeur" et les types "référence"

    Changer struct par classe résout le problème dans ce cas, mais il faut comprendre pourquoi. Dans ce cas, la structure Particle est de type valeur, quand on itère sur une liste de Particle chaque élément "a" de l'itération est une copie de l'élément de la liste, il ne sert donc à rien de de modifier une copie dont la durée de vie se limite à l'itération (foreach).

    Si garder la définition de structure était importante, il aurait mieux fallu passer par une boucle for et une modification "directe" de chaque élément (sans COPIE) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public void moveParticles(int dx, int dy)
            {
                for (int i = 0; i < myBel.Count; i++)
                {
                    myBel[i].x += dx;
                    myBel[i].y += dy;
                }
            }

  6. #6
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par cboun94 Voir le message
    Si garder la définition de structure était importante, il aurait mieux fallu passer par une boucle for et une modification "directe" de chaque élément (sans COPIE) :
    Sauf que ça marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct Bidule {public int I;}
    List<Bidule> liste = new List<Bidule>();
    liste.Add(new Bidule());
    liste[0].I = 8; // compile pas, parce que liste[0] est une copie, pas l'objet lui-même
    // par contre...
    Bidule[] tableau = new Bidule[1];
    tableau[0].I = 9; // OK
    Donc pour modifier en live un conteneur de structs, il faut 1) que ce soit un array et pas une liste, et 2) utiliser une boucle for et non pas un foreach.

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

Discussions similaires

  1. position d'un élément dans une liste
    Par john491 dans le forum Général Python
    Réponses: 8
    Dernier message: 05/05/2006, 13h13
  2. [VBA] sélection d'un élément dans une liste
    Par menguygw dans le forum Access
    Réponses: 3
    Dernier message: 26/04/2006, 12h18
  3. Sélectionner un élément dans une liste multiple
    Par sourivore dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 28/03/2006, 11h47
  4. [debutant] insertion d'éléments dans une List
    Par gwenou60 dans le forum Composants
    Réponses: 1
    Dernier message: 05/12/2005, 09h59
  5. contrôler l'absence d'un élément dans une liste donnée
    Par gendalf37 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 12/09/2005, 10h02

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