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 :

boucles foreach imbriquées!


Sujet :

C#

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 116
    Points : 46
    Points
    46
    Par défaut boucles foreach imbriquées!
    Bonjour tout le monde,

    J'ai un problème qui me rend digue!!!

    voici mon programme:

    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
     
     
    ArrayList petiteliste=new ArrayList ();
    ArrayList grandeliste=new ArrayList();
     
    for(int i=0;i<3;i++)
    {
         for(int j=0;j<2;j++)
         {
             petiteliste.Add(j);
         }
         grandeliste.Add(petiteliste);
    }
     
    string chaine="";
     
    foreach(ArrayList pl in grandeliste)
     {
        foreach(int elm in pl)
        {
           chaine=chaine+""+elm.ToString();
        }
     }
    voici le resultat que j'obtiens:

    0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

    Est ce que quelqu'un trouve ça illogique???

    Merci de m'aider

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Le résultalt est tout à fait logique. Qu'est qui est anormal selon toi ? Sinon ce sera dur de te répondre ^^

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 116
    Points : 46
    Points
    46
    Par défaut
    Merci de m'avoir répondu

    Jusque là je croyais que foreach avait le meme comportement que n'importe quel autre type de boucles(for,while,...)

    Ce que j'essaie de faire dans mon bout de code c'est simplement d'afficher tous les elements de ma grandeliste (les entiers) mais là j'ai l'impression qu'il refait cet affichage 3 fois (autant de fois qu'il ya d'itérations dans la première boucle)

    Est ce qu'il ya une solution à ça en utilisant precisément des boucles foreach ?

  4. #4
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Je pense que le problème vient de la façon dont tu construis tes listes. Cela génère un résultat auquel tu ne t'attendais pas au final.

    Tel que c'est codé, tu ajoutes 3 fois la même instance (petiteliste) dans grandeliste, donc tu auras 3 fois la même liste. Quand tu sors de tes boucles for, grandeliste contient 3 références à petiteliste. Comme à la fin, petiteliste contient 010101, et bien tu te retrouves avec 010101 3 fois.

    Je pense que c'est de là que vient ton incompréhension.

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 116
    Points : 46
    Points
    46
    Par défaut
    Mais vous ne croyez pas que chaque petite liste contient uniquement 01 puisque la boucle for à l'intérieur va de 0 à 1 ??
    au moins c'est ce que j'avais l'intention de faire

  6. #6
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Le problème c'est que tu utilises la même instance de petiteliste tout du long, donc au final tu as une et une seule petiteliste, pas plusieurs. Donc tu viens la compléter à chaque boucle. Je ne sais pas si c'est très clair par écrit, un dessin serait plus simple je crois ^^

    En fait, il faut que tu instancies une nouvelle petiteliste à chaque fois que tu en as ajoutée une à grandeliste.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    grandeliste.Add(petiteliste);
    petiteliste = new ArrayList();
    En faisant ainsi, tu auras bien 3 instances et non une seule, et tu auras 010101 dans ta chaîne. C'est à priori ce que tu attendais comme résultat.

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 116
    Points : 46
    Points
    46
    Par défaut
    voila j'arrive à afficher correctement mes elements:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ArrayList temp=new ArrayList();
    string chaine="";
     
    foreach(ArrayList pl in grandeliste)
     {
        temp=pl;
     }
     
     foreach(int elm in temp)
      {
           chaine=chaine+""+elm.ToString();
      }

  8. #8
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Ta première boucle foreach ne sert à rien là, ou bien je ne comprends pas ce que tu veux faire.

    Si le résultat que tu attendais est bien 010101, tu peux laisser les boucles foreach comme dans ton premier exemple de code.

  9. #9
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 116
    Points : 46
    Points
    46
    Par défaut
    Lorsque j'imbrique les foreach, c'est comme si à chaque iteration de la premiere boucle il arrive déjà à parcourir tous les entiers contenus dans mes petiteliste et donc une fois rentré dans la 2eme il refait le traitement 3 fois.
    Ma nouvelle boucle ne fait rien d'autre que de forcer le parcourt de la grande liste et c'est lors de la deuxième boucle que je procède à l'affichage

  10. #10
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Le résultat que tu attends est bien 010101 ? Que l'on soit bien d'accord sur ce point.

    Si c'est le cas, as-tu ajouté la ligne pour créer une instance de petiteliste à chaque ajout dans grandeliste ? cf. le 6ème post de ce sujet. Car à ce moment, tu obtiens le résultat attendu, sans rien changer d'autre.

  11. #11
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 116
    Points : 46
    Points
    46
    Par défaut
    Je n'ai pas ajouté la ligne pour instancier la nouvelle ArrayList dans mon code et le résultat auquel je m'attendais était bien 010101. curieux non?

  12. #12
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Essaye ca alors
    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
    ArrayList petiteliste=new ArrayList ();
    ArrayList grandeliste=new ArrayList();
     
    for(int i=0;i<3;i++)
    {
         for(int j=0;j<2;j++)
         {
             petiteliste.Add(j);
         }
         grandeliste.Add(petiteliste);
         petiteliste = new ArrayList();
    }
     
    string chaine="";
     
    foreach(ArrayList pl in grandeliste)
     {
        foreach(int elm in pl)
        {
           chaine=chaine+""+elm.ToString();
        }
     }
    Tu auras bien le résultat attendu et tu verras que les boucles foreach fonctionnent comme attendu

  13. #13
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 116
    Points : 46
    Points
    46
    Par défaut
    wéééééééééééééééé

    Je me suis enfin rendu compte(lundi matin) qu'il fallait initialiser la petiteliste à chaque itération de la première boucle parce que le pauvre programme ne faisait que rajouter des éléments à la petiteliste à ma demande!!!! Et c'était clair pourtant!
    J'avoue que j'ai bien déconné ce coup là et je vous dois quand meme des excuses et un grand merci.

    Ah les fin de semaines!

    Voici mon programme au cas ou ça intéresserait quelqu'un:
    Ici je fais une méthode qui extrait les données d'un dataset et les stocke dans un ArrayList que j'utilise dans un programme VTL (le langage qui ne connait que les boucles foreach)

    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
     
    public static ArrayList datasetToArrayList(DataSet ds)
    		{
    			ArrayList liste=new ArrayList();
     
     
    			for(int i=0;i<ds.Tables[0].Rows.Count;i++)
    			{   
    				ArrayList listligne=new ArrayList();
    				DataRow dr=ds.Tables[0].Rows[i];
    				for(int j=0;j<ds.Tables[0].Columns.Count;j++)
    				{
    					Object ob=dr.ItemArray[j];
    					listligne.Add(ob);
    				}
    				liste.Add(listligne);
    			}
    			return liste;
    		}

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

Discussions similaires

  1. boucles foreach imbriqué (tableau 3 colonnes)
    Par claire34 dans le forum Langage
    Réponses: 8
    Dernier message: 02/12/2010, 18h46
  2. Boucles foreach imbriquées: affichage non désiré
    Par renaud26 dans le forum Langage
    Réponses: 2
    Dernier message: 16/04/2009, 08h36
  3. [Dates] foreach imbrique ?
    Par pascale86 dans le forum Langage
    Réponses: 4
    Dernier message: 17/10/2005, 12h04
  4. [Tableaux] Boucle while imbriquer
    Par Le-Cortex dans le forum Langage
    Réponses: 11
    Dernier message: 09/09/2005, 14h22
  5. [Syntaxe] Boucle For imbriquées en 1.5
    Par Piolet dans le forum Langage
    Réponses: 5
    Dernier message: 09/01/2005, 00h49

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