Pergunta

Então, eu tenho um bug para remover

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

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

O problema é que ligar para x.remove () altera o foreach que se houver dois elementos ("x") e o primeiro será removido, o loop não chegará ao segundo elemento X.

Então, como devo estar em loop? Ou isso deve ser reescrito de outra maneira?

Foi útil?

Solução

Suspeito que o Linq possa ajudá -lo aqui da seguinte forma.

using System.Linq;

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

Se isso não funcionar (ou seja, o enumerador interno ainda estiver invalidado), faça uma cópia rasa dos elementos selecionados e exclua -os da seguinte forma.

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

Outras dicas

Crie uma coleção antes da lógica do loop, adicione os elementos a serem removidos à nova coleção e ligue para o item.remove em cada elemento da nova coleção.

Experimente sem um para em vez do foreach.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top