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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top