Удаление элементов X в цикле foreach - PullRequest
23 голосов
/ 07 октября 2009

Итак, у меня есть ошибка, чтобы удалить

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

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

Проблема в том, что вызов x.Remove () изменяет foreach таким образом, что если есть два элемента ("x"), а первый удален, цикл не попадает во второй элемент x.

Так как мне это зациклить? Или это следует переписать по-другому?

Ответы [ 3 ]

31 голосов
/ 07 октября 2009

Я подозреваю, что Linq может помочь вам здесь следующим образом.

using System.Linq;

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

Если это не сработает (т.е. внутренний перечислитель по-прежнему недействителен), сделайте поверхностную копию выбранных элементов и удалите их следующим образом.

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();
    }
}
1 голос
/ 07 октября 2009

Попробуйте это без for вместо foreach.

1 голос
/ 07 октября 2009

Создайте коллекцию перед логикой цикла, добавьте элементы, которые нужно удалить, в новую коллекцию, затем вызовите items.Remove для каждого элемента в новой коллекции.

...