Entfernen XElements in einer Schleife foreach
Frage
Also, ich habe einen Fehler
entfernenforeach (XElement x in items.Elements("x"))
{
XElement result = webservice.method(x);
if (/*condition based on values in result*/)
{
x.Remove();
}
}
Das Problem ist, dass Aufruf x.Remove () ändert die foreach, so dass, wenn es zwei Elemente ( „x“), und die ersten entfernt wird, die Schleife nicht auf das zweite Element x bekommt.
Wie sollte ich das sein Looping? Oder soll dies eine andere Art und Weise neu geschrieben werden?
Lösung
Ich vermute, dass Linq der Lage sein, können Sie sich hier wie zu helfen folgt.
using System.Linq;
void foo()
{
items.Elements("x")
.Where(x => condition(webservice.method(x)))
.Remove();
}
Wenn das nicht funktioniert (das heißt die interne enumerator noch für ungültig erklärt), macht eine flache Kopie der ausgewählten Elemente und löschen Sie sie folgt, wie.
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();
}
}
Andere Tipps
Erstellen Sie eine Sammlung vor der Schleife Logik, fügen Sie die Elemente der neuen Kollektion entfernt werden, dann die items.Remove in der neuen Kollektion auf jedem Element aufrufen.
Versuchen Sie es ohne eine für anstelle der foreach.