🧠 C#‑задача с подвохом: как работает `foreach` на изменяемой коллекции?
Представим, у нас есть такой код:
List<int> numbers = new List<int> { 1, 2, 3, 4 };
foreach (var n in numbers)
{
Console.WriteLine(n);
if (n == 2)
numbers.Remove(n); // 😬
}
❓ Вопрос: Что произойдёт при запуске?
🔍 Разбор
На первый взгляд — ничего особенного. Но при запуске вы получите:
1
2
Unhandled exception. System.InvalidOperationException:
Collection was modified; enumeration operation may not execute.
💣 Почему так?
✅ Как можно обойти?
Вариант 1 — использовать
for
вместо foreach
:
for (int i = 0; i < numbers.Count; i++)
{
if (numbers[i] == 2)
{
numbers.RemoveAt(i);
i--; // ⚠️ Обязательно откатить индекс!
}
}
Вариант 2 — создать копию коллекции:
foreach (var n in numbers.ToList())
{
if (n == 2)
numbers.Remove(n);
}
🧠 Вывод:
📎 Советы:
- При изменениях — лучше
for
или .ToList()
- Внимательно читайте исключения:
InvalidOperationException
— ваш друг в отладкеПоделитесь с коллегами — пусть никто не попадается 😊
@csharp_ci
>>Click here to continue<<