【问题标题】:What part of the C# language is .ForEach()?.ForEach() 是 C# 语言的哪一部分?
【发布时间】:2011-03-17 22:01:38
【问题描述】:

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

【问题讨论】:

  • 查看 Eric Lippert blogs.msdn.com/b/ericlippert/archive/2009/05/18/…的这篇文章
  • 值得注意的是,您的 #2 将遍历项目两次 - 一次用于创建列表,一次用于 ForEach 方法。如果你想使用这种完全合法的代码风格,你最好在 IEnumerable 上编写自己的 ForEach 扩展方法。

标签: c# linq nomenclature


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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&lt;T&gt;.ForEach 的调用
    • c =&gt; 是 c# 3.0 中引入的 lambda 表达式语法。

    如果您查看List&lt;T&gt;.ForEach 的文档,您会看到当时调用它所需的旧委托语法。

    【讨论】:

      【解决方案3】:

      it is a normal method of List&lt;T&gt; 尽管人们经常为其他IEnumerable&lt;T&gt; 提供自己的扩展方法。 LINQ does not provide a ForEach extension 由于其设计目标是功能性/使用不可变类型,ForEach 本质上是一种副作用/必要操作。

      【讨论】:

      • 这是我怀疑但不确定的,因为如果你在谷歌上搜索“linq foreach”,似乎普遍认为 .ForEach() 是 LINQ 的一个特性
      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        不是List&lt;T&gt;的扩展方法,是List&lt;T&gt;的常规方法。

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

        【讨论】:

          【解决方案6】:

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

          ForEachList&lt;T&gt; 类的普通实例方法。

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

          【讨论】:

          • @abatishchev:我的理解是 BCL 和 FCL 不是同义词。 FCL 是 BCL 的超集。见en.wikipedia.org/wiki/Base_Class_Libraryen.wikipedia.org/wiki/Framework_Class_Library
          • 是的,我都看到了。我觉得这两篇文章有些模糊。我不知道为什么微软还没有编辑它们。从文章中可以看出,BCL 仅包含 ECMA 标准化命名空间,而 FCL - 所有标准命名空间。对吗?
          • @abatischev:我不太确定,正如你所说,似乎没有任何官方信息可用。我的解释是 BCL 是 ECMA 标准库的超集,然后 FCL 是 BCL 的超集。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-13
          • 2012-12-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多