Выбор ответа 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, 3, 5] - Удалится только первое чётное, остальные пропустятся
InvalidOperationException: коллекция изменена при обходеправильный ответ- Бесконечный цикл: перечислитель вернётся к началу списка
Разбор
Перечислитель List<T> хранит номер версии списка и при каждом MoveNext сверяет его. Remove меняет версию, и следующий шаг бросает InvalidOperationException. Правильно: list.RemoveAll(x => x % 2 == 0) или обратный цикл for по индексам.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.