我有一个 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(); 在迭代之前解决这两个问题,但想了解为什么第二个示例会引发错误而第一个不会)