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 ??
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;
}
}
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 ??
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);
}
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'.
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.