Removendo xelementos em um loop foreach
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?
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