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语法,他应该按照我刚才说的做,用,
替换+
,这一切都很好,但是在处理这样简单的表达式时,只使用+
稍微便宜一点。