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

cedric774 21 Messages postés vendredi 14 mars 2008Date d'inscription 2 octobre 2012 Dernière intervention - 27 févr. 2011 à 14:32 - Dernière réponse : cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention
- 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
Afficher la suite 

8 réponses

Répondre au sujet
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 27 févr. 2011 à 16:38
0
Utile
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!
Commenter la réponse de cs_Robert33
cedric774 21 Messages postés vendredi 14 mars 2008Date d'inscription 2 octobre 2012 Dernière intervention - 27 févr. 2011 à 16:57
0
Utile
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 ??
Commenter la réponse de cedric774
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 27 févr. 2011 à 17:05
0
Utile
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!
Commenter la réponse de cs_Robert33
cedric774 21 Messages postés vendredi 14 mars 2008Date d'inscription 2 octobre 2012 Dernière intervention - 27 févr. 2011 à 17:44
0
Utile
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 ??
Commenter la réponse de cedric774
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 27 févr. 2011 à 18:04
0
Utile
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!
Commenter la réponse de cs_Robert33
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 27 févr. 2011 à 18:07
0
Utile
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!
Commenter la réponse de cs_Robert33
cedric774 21 Messages postés vendredi 14 mars 2008Date d'inscription 2 octobre 2012 Dernière intervention - 27 févr. 2011 à 19:40
0
Utile
merci pour les explications

on peut clore
Commenter la réponse de cedric774
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 27 févr. 2011 à 20:40
-2
Utile
De rien
Toi seul peux clore, en cliquant réponse acceptée.

Bonne soirée.
Bob.
C# is amazing, enjoy it!
Commenter la réponse de cs_Robert33

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.