Extracción XElements en un bucle foreach
Pregunta
Por lo tanto, tengo un error de quitar
foreach (XElement x in items.Elements("x"))
{
XElement result = webservice.method(x);
if (/*condition based on values in result*/)
{
x.Remove();
}
}
El problema es que llamar x.Remove () altera la foreach tal que si hay dos elementos ( "x"), y se retira el primero, el bucle no llegar al segundo elemento de x.
Entonces, ¿cómo debería ser este bucle? O si esto puede reescribir otra manera?
Solución
Sospecho que LINQ puede ser capaz de ayudarle a cabo aquí como sigue.
using System.Linq;
void foo()
{
items.Elements("x")
.Where(x => condition(webservice.method(x)))
.Remove();
}
Si eso no funciona (es decir, el empadronador interna todavía se invalida), hacer una copia superficial de los elementos seleccionados y eliminarlos como sigue.
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();
}
}
Otros consejos
Crea una colección antes de que la lógica de bucle, añadir los elementos que ser eliminado para la nueva colección, a continuación, llamar a la items.Remove en cada elemento en la nueva colección.
Inténtelo sin para en lugar del foreach.