如果我向某人解释下面的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()));
6条答案
按热度按时间lc8prwob1#
it is a normal method of
List<T>
虽然人们经常为其他IEnumerable<T>
提供自己的扩展方法。LINQ does not provide a ForEach extension由于其功能性/使用不可变类型的设计目标,ForEach是一个固有的副作用/命令性操作。gg0vcinb2#
它与LINQ无关,也不是一个扩展方法。
ForEach
是List<T>
类上的普通示例方法。(And如果你真的想吹毛求疵,那么
ForEach
根本不是C#语言的一部分:它是.NET基类库的一部分。)wb1gzix03#
它不是
List<T>
的一个扩展方法,而是List<T>
的一个正则方法。所以这和LINQ没有关系。如果有关系,“与LINQ正式关联”和“不与LINQ正式关联”之间的区别实际上并不十分有用,LINQ只是一堆链接的扩展方法(通常在
IEnumerable<T>
上)。在IEnumerable<T>
上,几乎没有任何地方可以将它与其他扩展方法区分开来。最好的区别是它们驻留在System.Linq
或System.Something.Linq
名称空间之一中。bkhjykvo4#
它不是LINQ。LINQ的一个设计方面是标准的LINQ方法没有副作用。ForEach方法将违反这一点。
Eric Lippert有一篇关于这个的博客文章:
Link
vaqhlq815#
让我们来分析一下:
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
的文档,您可以看到当时调用它所需的旧的委托语法。eqoofvh96#
副作用foreach将在Visual Studio 2010的Linq扩展中提供。