удаление элемента цикла foreach из перечисленной коллекции

1

Я не могу понять, почему это работает:

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.

В отношении документации перечисление остается в силе, если оно не изменилось. Я не понимаю, как я могу обойти это с помощью первого фрагмента кода? Может ли кто-то сломать это для меня?

Теги:
foreach
enumeration

2 ответа

4
Лучший ответ

Поскольку .ToList() не является литой операцией, она копирует ваш исходный список.

Таким образом, вы затем повторяете копию и изменяете оригинал.

  • 0
    Вы правы, я не могу поверить, что я не осознавал этого. Я все время думал, почему-то, что я кастую и назначаю. Что за глупая ошибка.
4

Поскольку в первом фрагменте кода вы не перебираете свой список, вы повторяете копию своего списка.

Таким образом, удаление элемента из исходного списка не вызывает никаких исключений, поскольку оно отличается от списка, который перечисляется.

  • 0
    Спасибо. Это имеет смысл. Это как не видеть очки на голове.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню