【问题标题】:Select fails to print to console选择无法打印到控制台
【发布时间】:2013-02-05 13:46:15
【问题描述】:

我希望将Select 用作功能性foreach。当我执行以下操作时,我希望它能够打印

foo
bar
baz

但是它不打印任何东西。怎么会?代码是

List<String> strings = new List<String>(){"foo", "bar", "baz"};
strings.Select(st => { Console.WriteLine(st); return 1; });

【问题讨论】:

  • 你并没有真正用Select枚举。
  • Select 推迟执行,直到实际需要结果。
  • Select 将序列中的每个元素投射到一个新的形式中,也就是说,您可以使用它来将集合元素转换为另一种类型。
  • +1 给 Gert 和 jrajva。尝试在Select 之后添加.ToList()
  • @JensKloster:或者Count(),这样可以避免实际创建新列表...

标签: c# linq select


【解决方案1】:

使用 ForEach

List<String> strings = new List<String>() { "foo", "bar", "baz" };
strings.ForEach(st => { Console.WriteLine(st);  });

通过使用 Select,您基本上定义了具有以下主体的匿名函数。

Console.WriteLine(st); 
return 1;

因此,Console.WriteLine 只会在您遍历列表时触发,如下所示:

var x= strings.Select(st => { Console.WriteLine(st); return 1; });

foreach (var i in x){ }

x.ToList()

这是错误的,使用 ForEach :)

【讨论】:

  • 我怎么没注意到它的存在?您能否补充一下未枚举结果的答案,并且需要额外调用 toList();?
  • 啊,我现在明白我是如何错过这个了。虽然 List 公开了 foreach,但 IEnumerable 出于某种原因没有。
  • @Martijn 我认为你最初的困惑是 some reason 的一部分 :)
  • @Gert 不公开 ForEach 所以人们开始求助于 Select 并把它搞砸并不是一个很好的理由
  • 我们不能简单地使用:strings.ForEach(Console.WriteLine); ?
猜你喜欢
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 2022-10-19
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
相关资源
最近更新 更多