Domanda

Così, ho un bug per rimuovere

foreach (XElement x in items.Elements("x")) 
{
    XElement result = webservice.method(x);

    if (/*condition based on values in result*/) 
    {
        x.Remove();
    }
}

Il problema è che la chiamata x.Remove () altera la foreach tale che se ci sono due elementi ( "x"), e il primo viene rimosso, il ciclo non fa arrivare al secondo elemento x.

Quindi, come dovrei essere looping questo? O questo dovrebbe essere riscritta in un altro modo?

È stato utile?

Soluzione

Ho il sospetto che LINQ può essere in grado di aiutarvi qui di seguito.

using System.Linq;

void foo()
{
    items.Elements("x")
         .Where(x => condition(webservice.method(x)))
         .Remove();
}

Se questo non funziona (cioè l'enumeratore interno è ancora invalidato), effettuare una copia degli elementi selezionati e eliminarli come segue.

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();
    }
}

Altri suggerimenti

Creare una raccolta prima della logica ciclo, aggiungere gli elementi da rimuovere alla nuova collezione, quindi chiamare l'items.Remove su ogni elemento nella nuova collezione.

Prova senza un perché invece del foreach.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top