【发布时间】:2016-02-02 12:36:30
【问题描述】:
编辑:这个问题可以标记为this question.的重复项
使用 foreach 循环或 ForEach LINQ 方法之间是否有任何差异(性能或其他方面)?
对于上下文,这是我的一种方法的一部分:
foreach (var property in typeof(Person).GetProperties())
{
Validate(property.Name);
}
我也可以使用此代码执行相同的任务:
typeof(Person)
.GetProperties()
.ToList()
.ForEach(property => Validate(property.Name));
什么时候使用循环结构比使用方法链接更好?
这是我使用ForEach 方法的另一个示例,但可以轻松地使用 foreach 循环和变量:
// 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);
}
【问题讨论】:
-
请注意,您必须先调用
ToList,然后才能以LINQ 样式使用ForEach- 迭代某些内容并执行这样的操作并不是真正的“LINQy”做事方式. -
@Thomas LINQ 没有
ForEach方法。正确的 LINQ 方法是使用foreach循环。 -
有什么方法可以更快地查看您携带的金额? 1:打开你的钱包,看看账单。 2:买一个新的钱包,把账单复印一下,放到新的钱包里,然后看看复印件。在软件工程术语中:您使用 ToList() 只是为了使用 ForEach 会产生 O(n) 存储成本。 .NET 和现代机器使存储变得便宜,它不是免费的。
-
@Noel 1. 大概方法是
void,所以这不会是有效的 2. 这意味着查询永远不会被迭代,因此方法永远不会运行。 -
Eric Lippert 有一篇关于此blogs.msdn.com/b/ericlippert/archive/2009/05/18/…的精彩博文