关于C#:foreach循环与foreach方法的区别?

foreach loop vs. ForEach method - Differences?

本问题已经有最佳答案,请猛点这里访问。

编辑:此问题可以标记为此问题的副本。

在使用foreach循环或ForEachLINQ方法之间是否存在任何差异(性能或其他方面)?

对于上下文,这是我的方法之一的一部分:

1
2
3
4
foreach (var property in typeof(Person).GetProperties())
{
    Validate(property.Name);
}

我也可以使用此代码执行相同的任务:

1
2
3
4
typeof(Person)
    .GetProperties()
    .ToList()
    .ForEach(property => Validate(property.Name));

什么时候使用循环结构比使用方法链接更好?

下面是另一个例子,我使用了ForEach方法,但可以很容易地使用foreach循环和变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// LINQ
PrivateData.Database.Users
           .Cast<User>()
           .Where(user => user.LoginType == LoginType.WindowsUser)
           .Select(user => new { Name = user.Name, Login = user.Login })
           .ToList()
           .ForEach(result => WriteObject(result));

// Loop
var users = PrivateData.Database.Users
               .Cast<User>()
               .Where(user => user.LoginType == LoginType.WindowsUser)
               .Select(user => new { Name = user.Name, Login = user.Login });

foreach(var user in users)
{
    WriteObject(user);
}


我会把你推迟到EricLippers的博客"foreach"和"foreach"。作为C编译器团队的前主要开发人员,我认为他的观点是正确的。

摘录:(参考.ForEach())

The first reason is that doing so violates the functional programming principles that all the other sequence operators are based upon. Clearly the sole purpose of a call to this method is to cause side effects. The purpose of an expression is to compute a value, not to cause a side effect. The purpose of a statement is to cause a side effect. The call site of this thing would look an awful lot like an expression (though, admittedly, since the method is void-returning, the expression could only be used in a"statement expression" context.) It does not sit well with me to make the one and only sequence operator that is only useful for its side effects.


循环是更好的样式,因为它是为您想要做的事情而专门设计的工具。它与语言结合得更好。例如,可以从循环中断。工具了解循环,它们不了解ForEach

这个循环对人类来说也更容易理解。ForEach非常罕见。

循环也更快,因为间接调用更少,委托分配更少,优化器可以在一个地方看到更多您正在做的事情。它还节省了ToList的调用。您也可以通过在IEnumerable上编写自定义扩展方法来保存该调用。

我认为这个循环在我能想到的所有情况下都是优越的。也许在某些情况下,ForEach方法的风格会更好,或者出于某种原因会更方便。

PLINQ也有一个ForAll,因为它可以并行化,所以出于效率的原因需要它。


在大多数情况下,这是个人偏好的问题。谈论性能:

大多数时候,Linq会慢一点,因为它引入了开销。如果你很关心性能,就不要使用LINQ。使用LINQ是因为您需要更短、更易于阅读和维护的代码。