Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# List.Select()方法不在Func内执行方法<&燃气轮机;_C#_.net_Lambda - Fatal编程技术网

C# List.Select()方法不在Func内执行方法<&燃气轮机;

C# List.Select()方法不在Func内执行方法<&燃气轮机;,c#,.net,lambda,C#,.net,Lambda,为什么在这个示例中没有打印名称 customer.Select()。它真的没有在Select()方法中执行Func,还是这里发生了一些不同的事情 代码: public static void Main() { var customers = new List<Customer>() { new Customer() { Name = "Bill" }, new Customer() { Name = "Steve" }

为什么在这个示例中没有打印名称

customer.Select()。它真的没有在
Select()
方法中执行
Func
,还是这里发生了一些不同的事情

代码:

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();
}
publicstaticvoidmain()
{
var customers=新列表()
{
新客户(){Name=“Bill”},
新客户(){Name=“Steve”}
};
客户。选择(
c=>
{
WriteLine(“名称为{0}”+c.Name);
返回0;
});
Console.Read();
}
有人能告诉我为什么不执行或打印吗?

您需要执行它:)-add ToList()


Select
除非对结果进行枚举,否则不会执行任何操作

如以下评论所述,这被称为(谢谢)

您可能正在查找的是
ForEach
,而不是
Select

customers.ForEach(
    c =>
    {
        Console.WriteLine("Name is {0}" + c.Name);
    });
Select是一个“投影”,它接受一个集合作为输入,并生成一个新集合,当对该集合进行枚举时,该集合将调用输入集合的每个元素上的指定委托,并且每次此类委托调用的结果都是输出集合的元素

因为你只是说“当你以后列举这件事的时候,这就是你应该做的”,然后再也没有列举过,所以什么也没有发生

因此,
Select
更像是一个如何获取一个集合并创建另一个集合的“配方”。在你执行配方之前(在上面枚举),配方只是一个配方

话虽如此,除非您确实需要它来使用Select,否则您应该这样做:

foreach (var c in customers)
    Console.WriteLine("Name is {0}" + c.Name);
另一方面,如果确实需要它来使用Select,则可以使用以下方法对其进行枚举:

foreach (var dummy in customers.Select(
    c =>
    {
        Console.WriteLine("Name is {0}" + c.Name);
        return 0;
    }))
{ } // do nothing here, empty loop body
  • 调用“强制枚举完成其工作”的众多方法之一,按照(我的观点)适用性的顺序:

    • 最后一个默认值
    • 托利斯特
    • 托雷
    例如:

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

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

  • 最后,您使用的是
    控制台。WriteLine
    不正确,您添加了一个参数,但随后使用字符串连接来生成结果字符串,这意味着您将看到:

    Name is {0}Bill
    Name is {0}Steve
    
    相反,这里是我最后的建议:

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

    另请参见:。如果您有一个像
    x.Select(c=>{…})
    这样的惰性源代码,那么您当然可以通过说
    .ToArray()
    .ToList()
    来强制枚举它。但是,这将创建一个数组,在迭代过程中需要每隔一段时间重新调整其大小(分配新的更大的数组,并从旧数组复制)。如果您不想要结果集合,而只想要副作用,则可以附加
    .LastOrDefault()
    。因此,从
    x.Select(c=>{…})转到
    x.Select(c=>{…}).LastOrDefault()
    。为什么不使用
    {}
    而不是
    ?它更容易阅读和正确理解。C#编译器应该知道它们是等价的。虽然我同意你在@JeppeStigNielsen所说的一切(如果你在这里写更多的评论,可能会更为如此:),但我这里的主要问题是大部分内容都是毫无意义的(“它”指问题中的问题,而不是你所写的!),如果OP不需要集合,则不应创建集合。他只需要
    foreach
    循环,他完成了,剩下的只是一个“奖金”。另请参见Jon Skeet的回答,其中建议使用带有空循环体的
    foreach
    循环,或者
    .LastOrDefault()
    WriteLine
    具有
    String.Format
    “内置”,只需将
    +
    替换为
    ,但他并不需要它,仅仅为了这个简单的表达式,
    “Name is”+c.Name
    更简单。啊,好吧,我不知道。我的想法总是相反:)这里的“更简单”,我可能是过早地优化了。如果他想使用string.Format语法,他应该按照我刚才说的做,用
    替换
    +
    ,这一切都很好,但是在处理这样简单的表达式时,只使用
    +
    稍微便宜一点。