Removing XElements in a foreach loop
So, I have a bug to remove
foreach (XElement x in items.Elements("x"))
{
XElement result = webservice.method(x);
if (/*condition based on values in result*/)
{
x.Remove();
}
}
The problem is that calling x.Remove() alters the foreach such that if there are two Elements("x"), and the first is removed, the loop doesn't get to the second x e开发者_StackOverflow中文版lement.
So how should I be looping this? Or should this be rewritten another way?
I suspect that Linq may be able to help you out here as follows.
using System.Linq;
void foo()
{
items.Elements("x")
.Where(x => condition(webservice.method(x)))
.Remove();
}
If that doesn't work (i.e. the internal enumerator is still invalidated), make a shallow copy of the selected elements and delete them as follows.
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();
}
}
Create a collection before the loop logic, add the elements to be removed to the new collection, then call the items.Remove on each element in the new collection.
Try it without a for instead of the foreach.
精彩评论