У меня есть запрос 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 (); прежде чем я повторю, но хотел бы понять, почему второй пример выдает ошибку, а первый нет)