TG Telegram Group & Channel
C# (C Sharp) programming | United States America (US)
Create: Update:

🧠 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.


💣 Почему так? Потому что `foreach` в C# использует **итератор (Enumerator)**, который **не допускает изменений коллекции во время прохода**. Это встроенная защита от непредсказуемых багов и гонок.

Как можно обойти?

Вариант 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);
}


🧠 Вывод:

В C# `foreach` нельзя использовать на коллекциях, которые вы планируете менять в теле цикла. Это распространённая ловушка даже для опытных разработчиков.

📎 Советы:
- При изменениях — лучше for или .ToList()
- Внимательно читайте исключения: InvalidOperationException — ваш друг в отладке

Поделитесь с коллегами — пусть никто не попадается 😊

@csharp_ci

🧠 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.


💣 Почему так? Потому что `foreach` в C# использует **итератор (Enumerator)**, который **не допускает изменений коллекции во время прохода**. Это встроенная защита от непредсказуемых багов и гонок.

Как можно обойти?

Вариант 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);
}


🧠 Вывод:

В C# `foreach` нельзя использовать на коллекциях, которые вы планируете менять в теле цикла. Это распространённая ловушка даже для опытных разработчиков.

📎 Советы:
- При изменениях — лучше for или .ToList()
- Внимательно читайте исключения: InvalidOperationException — ваш друг в отладке

Поделитесь с коллегами — пусть никто не попадается 😊

@csharp_ci


>>Click here to continue<<

C# (C Sharp) programming




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)