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

Résolu
cedric774 Messages postés 21 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 2 octobre 2012 - 27 févr. 2011 à 14:32
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 - 27 févr. 2011 à 20:40
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
A voir également:

8 réponses

cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
27 févr. 2011 à 16:38
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!
0
cedric774 Messages postés 21 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 2 octobre 2012
27 févr. 2011 à 16:57
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 ??
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
27 févr. 2011 à 17:05
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!
0
cedric774 Messages postés 21 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 2 octobre 2012
27 févr. 2011 à 17:44
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 ??
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
27 févr. 2011 à 18:04
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!
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
27 févr. 2011 à 18:07
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!
0
cedric774 Messages postés 21 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 2 octobre 2012
27 févr. 2011 à 19:40
merci pour les explications

on peut clore
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
27 févr. 2011 à 20:40
De rien
Toi seul peux clore, en cliquant réponse acceptée.

Bonne soirée.
Bob.
C# is amazing, enjoy it!
-2
Rejoignez-nous