如果我向某人解释以下 ForEach 功能,说 #2 是“是否准确?LINQ foreach 方法“或者只是一个”List<T> 扩展方法“这没有正式与 LINQ 关联吗?

var youngCustomers = from c in customers
                     where c.Age < 30
                     select c;

//1. traditional foreach approach
foreach (var c in youngCustomers)
{
    Console.WriteLine(c.Display());
}

//2. LINQ foreach approach?
youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display()));
有帮助吗?

解决方案

这是一种正常的方法 List<T> 尽管人们经常为其他人提供自己的扩展方法 IEnumerable<T>. LINQ 不提供 ForEach 扩展 由于其设计目标是功能性/使用不可变类型,ForEach 本质上是一种副作用/命令性操作。

其他提示

它与linq无关,它不是一个扩展方法。

ForEach List<T> 类。

(如果你想真的是nitpicky,那么ForEach根本不是c#语言的一部分:它是.NET基类库的一部分。)

它不是一个扩展方法 List<T>, ,这是一个常规方法 List<T>.

所以它与LINQ无关。如果有的话,“正式与 LINQ 关联”和“未正式与 LINQ 关联”之间的区别实际上并不是非常有用。LINQ 只是一堆链式扩展方法(通常在 IEnumerable<T>)。它与其他扩展方法几乎没有任何区别 IEnumerable<T>. 。最好的区别是它们位于其中之一 System.Linq 或者 System.Something.Linq 命名空间。

它不是linq。LINQ的一个设计方面是标准LINQ方法没有副作用。foreach方法会违反此。

Eric Lippert有一个博客文章所有关于这个:

http://博客.msdn.com / b / ericlippert / archive / 2009/05 / 18 / foreach-vs-foreach.aspx

youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display())); 
.

让我们打破它:

  • ToList是对.NET Framework 3.5引入的System.Linq.Enumerable.ToList()的调用
  • ForEach是对.NET Framework 2.0引入的System.Collections.Generic.List<T>.ForEach的调用
  • c =>是在c#3.0中引入的lambda表达语法。

如果查看 List<T>.ForEach ,您可以请参阅所需的旧委托语法然后调用它。

侧面实现的foreach将是(是)在Visual Studio 2010的LINQ扩展中提供。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top