.ForEach() 是 C# 语言的哪一部分?
-
17-09-2020 - |
题
如果我向某人解释以下 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 本质上是一种副作用/命令性操作。
其他提示
它不是一个扩展方法 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扩展中提供。
不隶属于 StackOverflow