Этот вопрос уже имеет ответ здесь:
Я пытаюсь удалить объект из ArrayList
и я получаю это Исключение:Collection was modified; enumeration operation may not execute.
Какие-либо идеи?
Вы удаляете элемент во время foreach
, да? Просто не можешь. Здесь есть несколько распространенных вариантов:
List
и RemoveAll
с предикатом итерацию назад по индексу, удаляя совпадающие элементы
для (int i = list.Count - 1; i> = 0; i--) {
if ({некоторый тест}) list.RemoveAt (i);
}
используют foreach
и помещают совпадающие элементы во второй список; теперь пронумеруйте второй список и удалите эти элементы из первого (если вы понимаете, что я имею в виду)
Вот пример (извините за опечатки)
var itemsToRemove = new ArrayList(); // should use generic List if you can
foreach (var item in originalArrayList) {
if (...) {
itemsToRemove.Add(item);
}
}
foreach (var item in itemsToRemove) {
originalArrayList.Remove(item);
}
ИЛИ если вы используете 3.5, Linq упрощает первый бит:
itemsToRemove = originalArrayList
.Where(item => ...)
.ToArray();
foreach (var item in itemsToRemove) {
originalArrayList.Remove(item);
}
Замените "..." на ваше условие, определяющее, нужно ли удалить элемент.
Одним из способов является добавление удаляемого(ых) элемента(ов) в новый список. Затем пройдите и удалите эти элементы.
Не изменять список внутри цикла, который выполняет итерацию по списку.
Вместо этого используйте for ()
или while ()
с индексом, двигаясь назад по списку. (Это позволит вам удалять объекты, не получив неверный индекс.)
var foo = new List<Bar>();
for(int i = foo.Count-1; i >= 0; --i)
{
var item = foo[i];
// do something with item
}
Вместо функции foreach() используйте цикл for() с числовым индексом.