9

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

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()));
4

6 回答 6

24

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

于 2010-07-19T13:20:49.530 回答
10

它与 LINQ 无关,也不是扩展方法。

ForEachList<T>类的普通实例方法。

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

于 2010-07-19T13:22:38.703 回答
2

它不是 的扩展方法List<T>,而是 的常规方法List<T>

所以它与LINQ无关。如果有,那么“正式与 LINQ 相关联”和未与 LINQ 正式相关联之间的区别实际上并不是一个非常有用的区别。LINQ 只是一堆链式扩展方法(通常在 上IEnumerable<T>)。将它与IEnumerable<T>. 最好的区别是它们驻留在System.LinqorSystem.Something.Linq命名空间之一中。

于 2010-07-19T13:22:43.770 回答
2

这不是 LINQ。LINQ 的设计方面之一是标准 LINQ 方法没有副作用。ForEach 方法会违反这一点。

Eric Lippert 有一篇关于此的博客文章:

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

于 2010-07-19T13:26:30.107 回答
1
youngCustomers.ToList().ForEach(c => Console.WriteLine(c.Display())); 

让我们分解一下:

  • ToListSystem.Linq.Enumerable.ToList()是在 .net framework 3.5 中引入的调用
  • ForEachSystem.Collections.Generic.List<T>.ForEach是在 .net framework 2.0 中引入的调用
  • c =>是 c# 3.0 中引入的 lambda 表达式语法。

如果您查看 的文档List<T>.ForEach,您可以看到当时调用它所需的旧委托语法。

于 2010-07-19T17:04:08.073 回答
0

副作用 foreach 将在 Visual Studio 2010 的 Linq 扩展中提供 ( is )。

于 2010-07-20T14:57:07.827 回答