Выбор ответа Junior Коллекции и LINQ спрашивают часто обновлено

Удаление из List в foreach

Вопрос

Что произойдёт при выполнении кода?

var list = new List<int> { 1, 2, 3, 4 };
foreach (var x in list)
    if (x % 2 == 0) list.Remove(x);

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: InvalidOperationException: коллекция изменена при обходе. Перечислитель List<T хранит номер версии списка и при каждом MoveNext сверяет его.

Варианты ответа

  1. Удалятся все чётные числа, список станет [1, 3, 5]
  2. Удалится только первое чётное, остальные пропустятся
  3. InvalidOperationException: коллекция изменена при обходеправильный ответ
  4. Бесконечный цикл: перечислитель вернётся к началу списка

Разбор

Перечислитель List<T> хранит номер версии списка и при каждом MoveNext сверяет его. Remove меняет версию, и следующий шаг бросает InvalidOperationException. Правильно: list.RemoveAll(x => x % 2 == 0) или обратный цикл for по индексам.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.