Я не могу понять, почему это работает:
var list = new List<int>() { 1, 4, 3, 2, 0, 1 };
foreach (var item in list.ToList())
{
if (item == 1)
{
list.Remove(item);
}
}
... и это не так:
var list = new List<int>() { 1, 4, 3, 2, 0, 1 };
foreach (var item in list)
{
if (item == 1)
{
list.Remove(item);
}
}
Если вы запустите второй фрагмент, это даст вам следующую ошибку:
Collection was modified; enumeration operation may not execute.
В отношении документации перечисление остается в силе, если оно не изменилось. Я не понимаю, как я могу обойти это с помощью первого фрагмента кода? Может ли кто-то сломать это для меня?
Поскольку .ToList()
не является литой операцией, она копирует ваш исходный список.
Таким образом, вы затем повторяете копию и изменяете оригинал.
Поскольку в первом фрагменте кода вы не перебираете свой список, вы повторяете копию своего списка.
Таким образом, удаление элемента из исходного списка не вызывает никаких исключений, поскольку оно отличается от списка, который перечисляется.