Удаление элементов X в цикле 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.
Итак, как я должен зацикливать это?Или это должно быть переписано другим способом?
Решение
Я подозреваю, что 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();
}
}
Другие советы
Создайте коллекцию перед выполнением логики цикла, добавьте элементы, которые необходимо удалить, в новую коллекцию, затем вызовите элементы.Удалите для каждого элемента в новой коллекции.
Попробуйте это без for вместо foreach .