запрос foreach и linq -нужна помощь, чтобы понять, пожалуйста

У меня есть запрос linq, результаты которого я повторяю в цикле foreach.

Первый — это запрос, который получает набор элементов управления из панели компоновки таблицы, затем я перебираю коллекцию и удаляю элементы управления из tableLayoutPanel, таким образом:

var AllItems = (from Item in this.tableLayoutPanel1.Controls.OfType<ItemControl>()
                select Item);

foreach (ItemControl item in AllItems)
{
    Trace.WriteLine("Removing " + item.ToString());
    this.tableLayoutPanel1.Controls.Remove(item);
    item.Dispose();
}

Вышеприведенное не работает так, как я ожидал (, т.е. выдает ошибку ), удаляет только половину элементов управления (нечетные номера )кажется, что на каждой итерации AllItems уменьшает себя, и хотя базовая коллекция изменяется, ошибка не возникает.

Если я сделаю то же самое с массивом строк:

        string[] strs = { "d", "c", "A", "b" };
        List<string> stringList = strs.ToList();

        var allitems = from letter in stringList
                       select letter;

        foreach (string let in allitems)
        {
            stringList.Remove(let);

        }

На этот раз Visual Studio выдает ошибку (, как и ожидалось, ), жалуясь на то, что базовая коллекция изменилась.

Почему первый пример тоже не взрывается?

В Iterators/IEnumerable есть что-то, чего я здесь не понимаю, и мне интересно, может ли кто-нибудь помочь мне понять, что происходит под капотом с linq и foreach.

(Я знаю, что могу решить обе проблемы с помощью AllItems.ToList (); прежде чем я повторю, но хотел бы понять, почему второй пример выдает ошибку, а первый нет)

7
задан Eric J. 19 July 2012 в 17:25
поделиться