为什么不在这个给定的例子中打印名称?
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打印?
答案 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 ,你可以使用以下方法来枚举它:
按照(我认为的)适用性的顺序,调用许多方法中的一种,强制枚举完成其工作&#34;
示例:
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
最后,您错误地使用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();