【发布时间】:2012-07-18 22:45:43
【问题描述】:
我有一个 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(); 解决这两个问题,但想了解为什么第二个示例会引发错误而第一个不会)
【问题讨论】: