Retrait XElements dans une boucle foreach
Question
Alors, j'ai un bug à supprimer
foreach (XElement x in items.Elements("x"))
{
XElement result = webservice.method(x);
if (/*condition based on values in result*/)
{
x.Remove();
}
}
Le problème est que l'appel x.Remove () modifie la foreach telle que s'il y a deux éléments ( « x »), et le premier est retiré, la boucle ne soit pas au deuxième élément x.
Alors, comment dois-je Looping cela? Ou devrait-il être réécrite d'une autre manière?
La solution
Je soupçonne que Linq peut être en mesure de vous aider ici comme suit.
using System.Linq;
void foo()
{
items.Elements("x")
.Where(x => condition(webservice.method(x)))
.Remove();
}
Si cela ne fonctionne pas (à savoir le recenseur interne est toujours invalidée), faire une copie superficielle des éléments sélectionnés et de les supprimer comme suit.
using System.Linq;
void foo()
{
List xElements = items.Elements("x")
.Where(x => condition(webservice.method(x)))
.ToList();
for (int i = xElements.Count - 1; i > -1; i--)
{
xElements[i].Remove();
}
}
Autres conseils
Créer une collection avant la logique de boucle, ajouter les éléments à enlever à la nouvelle collection, puis appelez la items.Remove sur chaque élément de la nouvelle collection.
Essayez sans pour au lieu du foreach.