【问题标题】:Lambda Expression conversion for a loop to display a list循环的 Lambda 表达式转换以显示列表
【发布时间】:2012-07-02 08:57:32
【问题描述】:

我正在尝试学习 lambda 表达式的使用,因此即使阅读了文档和其他各种相关文章,我仍然难以实现。 因此,如果我想将以下循环转换为 lambda 表达式,那么我将如何去做,我只需要一种方法来了解 lambda 表达式是如何工作的。
代码:

var pc = Enumerable.Range(2, 100).ToList();
var j = 0;
while (j < pc.Count)
{
    Console.WriteLine(pc[j]);
    j++;
}

【问题讨论】:

    标签: c# list lambda functional-programming


    【解决方案1】:
    Enumerable.Range(2, 100).ToList().ForEach(p => Console.WriteLine(p));
    

    分步说明

    1. Enumerable.Range 从 2 开始生成一个 IEnumarable&lt;int&gt;,长度为 100。即。项目将是 2,3,4.....101。

    2. .ToList()IEnumerable 转换为 List。为什么要转换?这样我们就可以使用ListForEach方法。

    3. 对您最重要的ForEach()。顾名思义,它对列表中的每个项目执行操作。在这里,列表的每个元素都被取出并放入运行时变量 p 中,该变量“转到”=&gt; Console.WriteLine(p) 以在控制台上写入。

    【讨论】:

    • 我认为它不会包含 102(2 到 102 将是 101 个元素)
    • @V4Vendetta:已更正。谢谢
    • 但是它比我写的显示输出的正常循环快吗?
    • 在您的情况下,性能并不重要,因为它是一个简单的程序。但是当侧 LINQ 或传统循环中有更多代码行时,传统循环比 LINQ 更快。
    【解决方案2】:

    我知道这不是你问题的答案,但这是一个例子,我总是重新考虑 LINQ 是否真的是解决问题的最佳解决方案。我知道你只需要一个例子来学习,但请记住,对于一个拿着锤子的人来说,一切看起来都像钉子......

    foreach (var item in Enumerable.Range(2, 100))
    {
      Console.WriteLine(item);
    }
    

    这对我来说更容易理解,不会创建不必要的列表。

    (希望我不会被太多愤怒的cmets...)

    【讨论】:

      【解决方案3】:

      试试

      Enumerable.Range(2, 100).ToList().ForEach(n => Console.WriteLine(n))
      

      但请注意,由于创建了额外的对象,通常 lambdas 很慢。不要在性能关键的应用程序中使用它们。

      【讨论】:

      • 所以它们比我提供显示的代码慢?我刚刚实现了一个筛子,然后在写完之后,在 codereview.stackexchange 上看到了别人的,并了解了一些关于 lambda 表达式的知识,我认为实现它会更好,因为代码变得相当简洁......所以我错了假设?
      • 这个例子的好处是不用创建列表,直接使用枚举。
      • Enumerable 没有.ForEach 方法,您需要先使用.ToList() 才能使用它。
      • @Bali C - 你是对的,这是直接在这里使用 foreach 循环的原因之一。
      【解决方案4】:
      pc.ForEach(f => Console.WriteLine(f));
      

      【讨论】:

        【解决方案5】:

        您无需创建Enumerable.Range 的内存列表。

        var result = string.Join(Environment.NewLine, Enumerable.Range(2, total));
        Console.Write(result);
        

        【讨论】:

        • 虽然这是一个不错的解决方案,但提问者希望使用 lambda 表达式。
        【解决方案6】:
        pc.ForEach(j => Console.WriteLine(j));
        

        【讨论】:

          【解决方案7】:

          你可以这样做:

          Enumerable.Range(2, 100).ToList().ForEach(x => Console.WriteLine(x));
          

          【讨论】:

            【解决方案8】:
             Enumerable.Range(2, 100).ToList().ForEach(n => Console.WriteLine(n));
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-02-20
              • 2015-10-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多