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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top