simlaboum
Messages postés39Date d'inscriptiondimanche 22 février 2009StatutMembreDernière intervention29 mars 2010
-
23 avril 2009 à 11:34
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 2013
-
23 avril 2009 à 17:00
Bon, en gros:
pour chaque élément d'un liste, si l'élément prend une certaine valeur, je le supprime.
il semblerait que ce ne soit pas prévu et autoriser par Maitre C#. En soit, ça ce tiens, mais il n'y aurait pas un truc du genre: "removeLater()'?
Merci et bien le bonjour chez vous.
Tagadatsointsoin!!!
A voir également:
Collection was modified; enumeration operation may not execute
ed73
Messages postés276Date d'inscriptionlundi 8 septembre 2008StatutMembreDernière intervention15 avril 20132 23 avril 2009 à 14:13
Bonjour,
En effet, il n'est pas possible de supprimer ou d'ajouter un élément à une collection pendant qu'on est en train d'itérer dessus.
Une solution pourrait d'être de renseigner une List des index des éléments à suprimer puis d'itérer sur cette liste et d'utiliser RemoveAt sur ta List<string>
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 23 avril 2009 à 14:23
Le plus simple et efficace est simplement de boucler avec un for inversé. Le foreach enmpeche la suppression. Le for n'empeche pas la suppression mais engendre des bugs (evidemment, on loupe des valeurs)
for (int i = myList.Count - 1; i >= 0; --i)
{
myList.RemoveAt(i);
}
simlaboum
Messages postés39Date d'inscriptiondimanche 22 février 2009StatutMembreDernière intervention29 mars 2010 23 avril 2009 à 13:57
Voila le code:
List<string> toto = new List<string>();
toto.Add("a");
toto.Add("c");
toto.Add("d");
foreach (string lettre in toto)
{
if (lettre == "c")
{
toto.Remove(lettre);
}
}
Désole, je ne trouve pas comment le mettre avec des belle couleur.
voila l'erreur:
Collection was modified; enumeration operation may not execute.
a+
Tagadatsointsoin!!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
ed73
Messages postés276Date d'inscriptionlundi 8 septembre 2008StatutMembreDernière intervention15 avril 20132 23 avril 2009 à 15:31
Je me suis exprimé un peu vite, il est bien évident que je voulais parler de foreach.
Par contre il y a des cas (rares) où l'utilisation de for() n'est pas possible. Actuellement je travaille avec Microsoft.Office.Interop.MSProject
(automation Microsoft Project) et il faut impérativment parcourir les diverses collections avec un énumérateur car il y a souvent des éléments null dans les collections qui ne sont pas comptabilisés par le Count et ce de manière totalement aléatoire, le seul moyen de ne rien rater est d'utiliser foreach(), mais bon c'est peut-être un bug de Project.
ed73
Messages postés276Date d'inscriptionlundi 8 septembre 2008StatutMembreDernière intervention15 avril 20132 23 avril 2009 à 16:54
Voici comment je m'en suis aperçu.
Pour itérer sur les ressources affectées à une tâche on avait une boucle
for(int i = 1;i<=Task.Resources.Count;i++)
if(Task.Resources[i]!=null)
DoSomething(Task.Resources[i]));
Il manquait systématiquement plusieures ressources, après plusieurs essais j'ai finalement fait un truc stupide pour voir
for(int i = 1;i<=Task.Resources.Count + 10;i++)
if(Task.Resources[i]!=null)
DoSomething(Task.Resources[i]));
Eh bien ça a marché jusqu'à Task.Resources.Count + 3 et j'ai récupéré toutes les ressources.
Finalement la solution était
foreach(Resource res in Task.Resources)
DoSomething(res);
L'itération se fait correctement et je récupère toutes les ressources. Je pense que MSProject ne gère pas les collections comme il faudrait et ne comptabilise pas les éléments null dans le Count.
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 23 avril 2009 à 17:00
Etrange cette histoire là...
Quoi qu'il en soit, ce n'est pas un problème de boucle comme j'ai crû comprendre, mais plutôt d'une property qui retourne pas correctement le nombre d'élément, ce qui est quand même bien différent...
Je ne peux pas faire de testes supplémentaires, je n'ai pas les outils nécessaire pour ça installé.