Подтвердить что ты не робот

Удаление XElements в цикле foreach

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

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.

Итак, как мне это сделать? Или это должно быть переписано другим способом?

4b9b3361

Ответ 1

Я подозреваю, что 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();
    }
}

Ответ 2

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

Ответ 3

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