显然,有很多方法可以迭代一个集合。好奇是否存在任何差异,或者为什么要使用另一种方式。

第一类:

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循环中的列表中删除项目可能会有副作用。在此问题的注释中描述了最常见的一个。

通常,如果要从列表中删除多个项目,则需要从实际删除中确定要删除哪些项目。它不能使代码紧凑,但是可以保证您不会错过任何项目。

07-24 09:47
查看更多