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 :

Suppression d'un élément d'une List


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Points : 37
    Points
    37
    Par défaut Suppression d'un élément d'une List
    Bonjour tout le monde

    J'ai actuellement un souci avec la suppression d'un élément d'une List< >
    au début, je déclare une liste dans laquelle je mets le résultat d'une requête SQL, j'ai donc une liste d'objets (carte dans mon cas) qui est correctement remplie

    Ensuite, je distribue les cartes (numCarte - typeCarte - description), chaque carte est différente, je les génére avec la méthode RandomNumber(int min, int max) qui renverra un nombre allant de 1 à 42 dans mon cas

    une fois ce nombre généré, j'aimerais supprimer l'objet qui s'y rapporte de la liste afin d'éviter de le voir réapparaitre par la suite lors de la généréation

    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
     
    for(int i=0; i < 42; i++)
    {
     
    // Prendre un nombre entre 1 et 42 (n°carte)
    int numCarte = RandomNumber(1, 42);
     
    foreach (Carte c in carte)               // parcours de la list
    {
          if (numCarte == c.NumCarte)
          {
                   MessageBox.Show(numCarte + " - " + c.Description);
                  //carte.RemoveAt(numCarte);
          }
    }
    }
    mais je ne peux pas supprimer un élément d'une liste qui est entrain d'être parcourue, donc comment faire ??

    merci pour vos réponses

  2. #2
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Utilise un for plutot qu'un foreach

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Points : 37
    Points
    37
    Par défaut
    tu pourrais développer stp

    car je suppose que tu proposes d'utiliser le list.count() comme condition mais que y mets-tu comme initialisation et incrémentation ??

  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
    Autant passer par la méthode RemoveAll.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int numCarte = RandomNumber(1, 42);
    carte.RemoveAll(c => c.NumCarte == numCarte);

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Points : 37
    Points
    37
    Par défaut
    le but est de supprimer l'élément de la liste qui correspond au numCarte qui a été généré et de répéter cette opération 42x fois (le nombre de carte)

    de sorte
    qu'à la 1ère fois, il y a 42 éléments
    qu'à la 11ère fois, il y a 32 éléments
    qu'à la 21ère fois, il y a 22 éléments
    qu'à la 42ère fois, il y a 1 élément

    mais je continue à boucler sur la liste : List<Carte>

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Citation Envoyé par cedric774
    tu pourrais développer stp

    car je suppose que tu proposes d'utiliser le list.count() comme condition mais que y mets-tu comme initialisation et incrémentation ??
    Bien que la proposition de stormimonn soit tres efficace, je vais quand meme développer car il semble que la connaissance élémentaire d'une simple boucle for soit en voie de disparition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int numCarte = RandomNumber(1, 42);
     
    for(int i;i<carte.Count;i++)               // parcours de la list
    {
       if (numCarte == carte[i].NumCarte)
       {
           MessageBox.Show(numCarte + " - " + c.Description);
           carte.RemoveAt(i);
           break;
       }
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 48
    Points : 37
    Points
    37
    Par défaut
    je vais récapituler car ce n'est pas clair pour moi et que cela ne fait pas ce à quoi je m'attends

    1) je génère des nombres allant de 1 à 42
    2) je parcours la list
    3) j'ai trouvé l'élément correspondant au nombre
    4) je supprime cet élément

    et je répète ça 42x, sachant que 2 nombres ne peuvent être égaux (excusez moi je ne l'avais pas précisé)


    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
     
    for (int j = 0; j < 42; j++)
    {
         // Prendre un nombre entre 1 et max (42) (n°carte)
         int numCarte = RandomNumber(1, 42);
         for (int k = 0; k < carte.Count; k++)               // parcours de la list
          {
                   if (numCarte == carte[k].NumCarte)
                   {
                          MessageBox.Show("cpt : " + cpt + " n°" + numCarte + " - " + carte[k].Description);
                          cpt++;
                          carte.RemoveAt(numCarte);
                          break;
                   }
          }
    }
    de sorte
    qu'à la 1ère fois, il y a 42 éléments
    qu'à la 11ère fois, il y a 32 éléments
    qu'à la 21ère fois, il y a 22 éléments
    qu'à la 42ère fois, il y a 1 élément

    mais je continue à boucler sur la liste : List<Carte>

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Tout d'abord c'est :
    Ensuite ce n'est pas parce que tu va generer 42 fois un nombre aléatoire entre 1 et 42 que tu aura 42 fois un nombre distinct

    Il n'est pas impossible que tu génére une série du genre

    1,5,5,1,7,1,41,9,42,42, etc..
    Donc a la fin de ta boucle principale des carte peuvent ne pas avoir été traitées

    Ce serait peut etre plus pertinent de faire un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (carte.Count>0)
    {
         // Prendre un nombre entre 1 et max (42) (n°carte)
         int numCarte = RandomNumber(0, carte.count);
         carte.RemoveAt(numCarte);
    }

Discussions similaires

  1. [PHP 5.4] Suppressions des lignes/éléments d'une liste
    Par aspkiddy dans le forum Langage
    Réponses: 6
    Dernier message: 10/04/2014, 18h48
  2. Suppression d'un élément dans une liste chainée
    Par jbarreau-mainson dans le forum Débuter
    Réponses: 1
    Dernier message: 06/05/2009, 15h49
  3. Suppression d'un élément d'une list
    Par SimOOn dans le forum SL & STL
    Réponses: 15
    Dernier message: 16/01/2008, 21h18
  4. Suppression d' éléments dans une liste.
    Par conan76 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 02/03/2007, 09h33
  5. Réponses: 8
    Dernier message: 01/04/2006, 10h10

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