C#使用ForEach进行枚举时修改IEnumerable
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#使用ForEach进行枚举时修改IEnumerable,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1595字,纯文字阅读大概需要3分钟。
内容图文
这是我正在探索的东西,看看我是否可以采取的是什么
List<MdiChild> openMdiChildren = new List<MdiChild>();
foreach(child in MdiManager.Pages)
{
openMdiChildren.Add(child);
}
foreach(child in openMdiChild)
{
child.Close();
}
并缩短它不需要2个foreach循环.
注意我已经更改了调用对象的内容以简化此示例(这些来自第三方控件).但是为了获得信息和理解
MdiManager.Pages继承表单CollectionBase,后者继承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.
编辑
我想说清楚我的问题是如何简化这个问题,我只是想了解为什么在我执行它时修改集合没有问题,因为我现在已经编写了它.
解决方法:
您对ToList()的调用可以将您保存在此处,因为它基本上复制了您正在执行的操作. ToList()实际上创建了一个List< T> (包含此情况下的列表< MdiChild>)包含MdiManager.Pages中的所有元素,然后您对ForEach的后续调用将在该列表上运行,而不是在MdiManager.Pages上运行.
最后,这是一个风格偏好的问题.我个人并不喜欢ForEach函数(我更喜欢Where和ToList()之类的查询组合函数,因为它们的简单性以及它们没有被设计为对原始源有副作用,而ForEach不是).
你也可以这样做:
foreach(child in MdiManager.Pages.Cast<MdiChild>().ToList())
{
child.Close();
}
从根本上说,这三种方法完全相同(它们将MdiManager.Pages的内容缓存到List< MdiChild>中,然后遍历该缓存列表并在每个元素上调用Close().
内容总结
以上是互联网集市为您收集整理的C#使用ForEach进行枚举时修改IEnumerable全部内容,希望文章能够帮你解决C#使用ForEach进行枚举时修改IEnumerable所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。