显然,有很多方法可以迭代一个集合。好奇是否存在任何差异,或者为什么要使用另一种方式。
第一类:
List<string> someList = <some way to init>
foreach(string s in someList) {
<process the string>
}
另一种方式:
List<string> someList = <some way to init>
someList.ForEach(delegate(string s) {
<process the string>
});
我想想起来,您将可以指定一个可重用的委托(delegate),而不是上面使用的匿名委托(delegate)...
最佳答案
两者之间有一个重要且有用的区别。
因为.ForEach使用for
循环来迭代集合,所以这是有效的(编辑:.net 4.5之前的 -实现已更改,并且都抛出):
someList.ForEach(x => { if(x.RemoveMe) someList.Remove(x); });
而
foreach
使用枚举器,因此这是无效的:foreach(var item in someList)
if(item.RemoveMe) someList.Remove(item);
tl; dr:请勿将此代码复制粘贴到您的应用程序中!
这些示例不是最佳实践,它们只是为了演示
ForEach()
和foreach
之间的区别。从
for
循环中的列表中删除项目可能会有副作用。在此问题的注释中描述了最常见的一个。通常,如果要从列表中删除多个项目,则需要从实际删除中确定要删除哪些项目。它不能使代码紧凑,但是可以保证您不会错过任何项目。