linq .ForEach()是C#语言的哪一部分?

qzlgjiam  于 2023-02-10  发布在  C#
关注(0)|答案(6)|浏览(242)

如果我向某人解释下面的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()));
lc8prwob

lc8prwob1#

it is a normal method of List<T>虽然人们经常为其他IEnumerable<T>提供自己的扩展方法。LINQ does not provide a ForEach extension由于其功能性/使用不可变类型的设计目标,ForEach是一个固有的副作用/命令性操作。

gg0vcinb

gg0vcinb2#

它与LINQ无关,也不是一个扩展方法。
ForEachList<T>类上的普通示例方法。
(And如果你真的想吹毛求疵,那么ForEach根本不是C#语言的一部分:它是.NET基类库的一部分。)

wb1gzix0

wb1gzix03#

它不是List<T>的一个扩展方法,而是List<T>的一个正则方法。
所以这和LINQ没有关系。如果有关系,“与LINQ正式关联”和“不与LINQ正式关联”之间的区别实际上并不十分有用,LINQ只是一堆链接的扩展方法(通常在IEnumerable<T>上)。在IEnumerable<T>上,几乎没有任何地方可以将它与其他扩展方法区分开来。最好的区别是它们驻留在System.LinqSystem.Something.Linq名称空间之一中。

bkhjykvo

bkhjykvo4#

它不是LINQ。LINQ的一个设计方面是标准的LINQ方法没有副作用。ForEach方法将违反这一点。
Eric Lippert有一篇关于这个的博客文章:
Link

vaqhlq81

vaqhlq815#

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的文档,您可以看到当时调用它所需的旧的委托语法。

eqoofvh9

eqoofvh96#

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

相关问题