List.Select()方法不执行Func<>内的方法

时间:2014-12-05 11:53:19

标签: c# .net lambda

为什么不在这个给定的例子中打印名称?

customer.Select()方法确实不打印数据。它真的没有在Func<>方法中执行Select()或者在这里发生了不同的事情吗?

代码:

public static void Main()
{
     var customers = new List<Customer>()
     {
         new Customer() { Name = "Bill" }, 
         new Customer() { Name = "Steve" }
    };

    customers.Select(
    c =>
    {
        Console.WriteLine("Name is {0}" + c.Name);
        return 0;
    });

    Console.Read();
}

有人请告诉我为什么不执行OR打印?

2 个答案:

答案 0 :(得分:10)

除非您对结果进行枚举,否则

Select不执行任何操作

如下面的评论中所述,这称为deferred execution(感谢@BCdotNet

您可能正在寻找ForEach而不是Select

customers.ForEach(
    c =>
    {
        Console.WriteLine("Name is {0}" + c.Name);
    });

选择是&#34;投影&#34;,它将一个集合作为输入,并生成一个新的集合,当枚举时将调用输入集合的每个元素上的指定委托,以及每个元素的结果委托调用是输出集合的元素。

因为你只是说&#34;当你后来列举这个时,这就是你应该做的事情&#34;,然后从未对它进行枚举,什么也没发生。

Select因此更像是一个&#34;配方&#34;如何拍摄一个集合并创建另一个集合。在你执行配方(枚举它)之前,配方只是一个食谱。

说了这么多,除非你实际上需要它才能使用Select,这就是你应该做的:

foreach (var c in customers)
    Console.WriteLine("Name is {0}" + c.Name);

另一方面,如果你真的需要它来使用Select ,你可以使用以下方法来枚举它:

  1. 按照(我认为的)适用性的顺序,调用许多方法中的一种,强制枚举完成其工作&#34;

    • LastOrDefault
    • ToList
    • ToArray的

    示例:

    customers.Select(
        c =>
        {
            Console.WriteLine("Name is {0}" + c.Name);
            return 0;
        }).LastOrDefault();
    
  2. 简单地列举一下:

    foreach (var dummy in customers.Select(
        c =>
        {
            Console.WriteLine("Name is {0}" + c.Name);
            return 0;
        }))
    { } // do nothing here, empty loop body
    

  3. 最后,您错误地使用Console.WriteLine,您已添加了参数,但随后使用字符串连接来构建结果字符串,这意味着您将看到:

    Name is {0}Bill
    Name is {0}Steve
    

    相反,这是我的最终建议:

    foreach (var c in customers)
        Console.WriteLine("Name is " + c.Name);
    

答案 1 :(得分:0)

你需要执行它:) - 添加ToList()

customers.Select(
                c =>
                {
                    Console.WriteLine("Name is {0}" + c.Name);
                    return 0;
                }).ToList();