Набор был изменен; операция перечисления не может выполниться в ArrayList [дубликат]

Этот вопрос уже имеет ответ здесь:

Я пытаюсь удалить объект из ArrayList и я получаю это Исключение:
Collection was modified; enumeration operation may not execute.

Какие-либо идеи?

78
задан Kay Lee 4 March 2017 в 20:34
поделиться

5 ответов

Вы удаляете элемент во время foreach , да? Просто не можешь. Здесь есть несколько распространенных вариантов:

  • используйте List и RemoveAll с предикатом
  • итерацию назад по индексу, удаляя совпадающие элементы

     для (int  i = list.Count - 1; i> = 0; i--) {
      if ({некоторый тест}) list.RemoveAt (i);
     }
     
  • используют foreach и помещают совпадающие элементы во второй список; теперь пронумеруйте второй список и удалите эти элементы из первого (если вы понимаете, что я имею в виду)

191
ответ дан 24 November 2019 в 10:24
поделиться

Вот пример (извините за опечатки)

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);
}

Замените "..." на ваше условие, определяющее, нужно ли удалить элемент.

24
ответ дан 24 November 2019 в 10:24
поделиться

Одним из способов является добавление удаляемого(ых) элемента(ов) в новый список. Затем пройдите и удалите эти элементы.

8
ответ дан 24 November 2019 в 10:24
поделиться

Не изменять список внутри цикла, который выполняет итерацию по списку.

Вместо этого используйте for () или while () с индексом, двигаясь назад по списку. (Это позволит вам удалять объекты, не получив неверный индекс.)

var foo = new List<Bar>();

for(int i = foo.Count-1; i >= 0; --i)
{
  var item = foo[i];
  // do something with item
}
5
ответ дан 24 November 2019 в 10:24
поделиться

Вместо функции foreach() используйте цикл for() с числовым индексом.

2
ответ дан 24 November 2019 в 10:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: