【发布时间】:2011-03-11 04:35:01
【问题描述】:
这是我正在探索的东西,看看我是否可以接受它
List<MdiChild> openMdiChildren = new List<MdiChild>();
foreach(child in MdiManager.Pages)
{
openMdiChildren.Add(child);
}
foreach(child in openMdiChild)
{
child.Close();
}
并将其缩短为不需要 2 个 foreach 循环。
注意我已经更改了对象的名称以简化此示例(这些来自第 3 方控件)。但对于信息和理解
MdiManager.Pages继承了CollectionBase的形式,而IEnumerable又继承了IEnumerable
而MdiChild.Close() 会从MdiManager.Pages 集合中移除打开的子节点,从而更改集合并导致如果在枚举期间修改了集合,则枚举会引发异常,例如..
foreach(child in MdiManage.Pages)
{
child.Close();
}
我能够将foreach 工作到
((IEnumerable) MdiManager.Pages).Cast<MdiChild>.ToList()
.ForEach(new Action<MdiChild>(c => c.Close());
为什么在枚举期间修改集合没有相同的问题?我最好的猜测是,在枚举由 ToList 调用创建的 List 时,它实际上是在对 MdiManager.Pages 集合中的匹配项而不是生成的 List 执行操作。
编辑
我想明确说明我的问题是如何简化这一点,我只是想了解为什么在执行时修改集合没有问题,因为我现在已经编写了它。
【问题讨论】:
-
我的想法是,因为它提供了一个回调,所以每个线程都可以在调用任何一个项目之前为一个项目准备一个参数(从而遍历所有项目);因此,当回调执行时,您已经迭代了可枚举。
-
@Tejs:这是不正确的;这里没有多线程。
标签: c# .net enumeration