【问题标题】:Why does this simple LINQ expression NOT work?为什么这个简单的 LINQ 表达式不起作用?
【发布时间】:2014-10-15 15:45:26
【问题描述】:

这一定很简单,但我不明白为什么不允许这样做:

var testList = new List<int> { 2, 3, 400, 304, 50, 41 };
testList.Select(x => Console.WriteLine(x));

但这很好:

testList.Select(x => x * 2);

我在哪里误解 LINQ 导致这种混乱?

【问题讨论】:

  • 一个 select 语句操作列表并返回一个新的。您应该在 List 类型上使用 ForEach
  • 你可能想使用testList.ForEach(i =&gt; Console.WriteLine(i))
  • LINQ 是一种用于提问的语言,而不是用于引起副作用的语言。不要使用 LINQ 表达式作为产生副作用的控制流;有一个非常好的foreach 循环已经意味着“对这个集合的每个成员造成副作用”。

标签: c# linq


【解决方案1】:

问题在于传递给Select() 的函数必须返回一个值,因为Select() 的目的是将序列的元素投影到其他值。但是Console.WriteLine(x) 返回 void(无值)。

【讨论】:

    【解决方案2】:

    .Select 接受 Func&lt;TSource, TResult&gt;(一个接受 TSource 并返回 TResult 的 lambda)。

    由于 Console.WriteLinevoid,因此您的 lambda 不会返回任何内容,因此不符合要求。

    【讨论】:

    • (Nitpick:lambda 没有特定类型,因为编译器无法推断委托类型。它可以隐式转换为 Action&lt;int&gt;,但它也可以很容易地隐式转换为其他一些委托类型接受 any 类型的单个参数并返回 void。)
    • @cdhowie:感谢您的反馈;我稍微更新了语言。
    • @cdhoie:喜欢你的评论,因为编译器的错误实际上是无法推断参数类型,尝试显式类型参数。错误消息可能会有点令人困惑,但猜测这不是常见错误...谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    相关资源
    最近更新 更多