Suppression d'un élément d'une LIST [Résolu]

Signaler
Messages postés
21
Date d'inscription
vendredi 14 mars 2008
Statut
Membre
Dernière intervention
2 octobre 2012
-
cs_Robert33
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
-
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


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

8 réponses

Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
27
Bonjour

En effet si tu modifies la collection dans une boucle foreach tu dois arreter l'itération.
mais dans ton cas, une fois supprimer la carte il n'y a pas de raison de continuer l'itération
puisque tu dois regenerer un nombre aléatoire pour le carte suivante.
mets un break; après le remove.

                foreach (Carte c in carte)               // parcours de la list
                {
                    if (numCarte == c.NumCarte)
                    {
                        MessageBox.Show(numCarte + " - " + c.Description);
                        carte.Remove(c);
                        break;
                    }
                }


Bob.
C# is amazing, enjoy it!
Messages postés
21
Date d'inscription
vendredi 14 mars 2008
Statut
Membre
Dernière intervention
2 octobre 2012

je ne suis malheureusement pas sur le bon ordinateur actuellement pour pouvoir tester la solution

mais je voudrais être sur donc

1) j'ai une boucle (dans ce cas-ci que j'effectue 42x)
2) je génère un nombre aléatoire allant de 1 à 42
3) je recherche l'objet ayant le même nombre comme identifiant
4) je supprime cet objet


Ex : si je génère un nombre égal à 10, j'arrive donc sur le 10ème objet puisqu'il s'agit d'une liste triée

je supprime cet objet (le 10ème)

si lors de la boucle suivante, je régénère 10, je serais bien au 11ème objet ??


et imaginons qu'après x boucles donc après avoir supprimé quelques objets, je génère 42, y'aura-t'il un problème ??
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
27
En effet, mais ça c'est un probleme d'algorithmique, pas de codage
Si tu veux extraire de ta liste toutes les cartes essaye plutôt ça:
Random randObj = new Random((int)DateTime.Now.Ticks);
//Tant qu'il reste des cartes
while (carte.Count > 0)
{
    // Prendre une carte au hasard dans la liste
    Carte c = carte[randObj.Next(0, carte.Count)];
    MessageBox.Show(string.Format("Carte N° {0} - {1}", c.NumCarte, c.Description));
    carte.Remove(c);
}


Bob.
C# is amazing, enjoy it!
Messages postés
21
Date d'inscription
vendredi 14 mars 2008
Statut
Membre
Dernière intervention
2 octobre 2012

merci beaucoup, je viens de tester le bout de code, et il fonctionne

par contre, peux tu m'expliquer l'utilité de :
Random randObj = new Random((int)DateTime.Now.Ticks);


je ne comprends pas en quoi, aller rechercher la date actuelle est importante pour une génération de nombres ??
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
27
Bonsoir

L'objet Random à besoin d'une base à l'initialisation, il utilisera cette base pour generer les séquences aléatoires.
tu peux passer un nombre fixe, mais dans ce cas les séquences générées seront toujours les mêmes à chaque lancement du programme.
L'utilisation du Tick, permet une intialisation 'pseudo aléatoire'.

Bob.
C# is amazing, enjoy it!
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
27
Re

Autant pour moi, en fait le constructeur par défaut de Random fait la même chose (il part de la date courante)
donc Random randObj = new Random(); est suffisant.


Bob.
C# is amazing, enjoy it!
Messages postés
21
Date d'inscription
vendredi 14 mars 2008
Statut
Membre
Dernière intervention
2 octobre 2012

merci pour les explications

on peut clore
Messages postés
834
Date d'inscription
samedi 15 novembre 2008
Statut
Membre
Dernière intervention
14 janvier 2017
27
De rien
Toi seul peux clore, en cliquant réponse acceptée.

Bonne soirée.
Bob.
C# is amazing, enjoy it!