【问题标题】:How can I use a `lambda-expression` in the `select` tokens of a `query-expression` in C#如何在 C# 中的“查询表达式”的“选择”标记中使用“lambda 表达式”
【发布时间】:2018-12-29 08:11:40
【问题描述】:

我想在 select 令牌中使用 lambda-expression。下面是一个简化的例子:

  // Example-0; It is NOT compilable.
  var xs = from v in Enumerable.Range( 0, 4 ) select w => w;

但是,该示例无法编译。 (我使用的是 C#-7.0/.net Framework 4.7.2)

错误 CS1942:select' clause is incorrect. Type inference failed in the call toSelect' 中的表达式类型

我在下面尝试了另一种类似的模式:

  // Example-1; It can compile.
  Func< int, int > f = w => w;
  var xs = from v in Enumerable.Range( 0, 4 ) select ( v, f );

但是,Example-1 很混乱,它无法捕获select 标记中的值。

  // Example-2; It is NOT compilable.
  var xs = from v in Enumerable.Range( 0, 4 ) select w => w + v;

如何编码?

【问题讨论】:

    标签: c# linq select lambda capture


    【解决方案1】:

    您可以使用这样的语法来选择Func&lt;int, int&gt;

    var xs = from v in Enumerable.Range(0, 4) select new Func<int, int>(x => x + v);
    

    我不确定你将要使用它的真实场景,但例如你可以这样调用这些函数:

    xs.ToList().ForEach(x => MessageBox.Show(x(1).ToString()));
    

    【讨论】:

      【解决方案2】:

      您必须选择是要使用方法语法还是查询语法。将它们混合在一起会使它们变得难以阅读、难以掌握、难以测试和难以维护。

      使用方法语法时,您的查询会很简单:

      var result = Enumerable.Range( 0, 4 ); // no select needed
      

      假设您简化了问题:

      Func<int, int> f = x => 4*x*x - 2*x +8;
      var result = Enumerable.Range(0,4).Select(x => f(x));
      

      用文字来表示:从 0 开始的四个整数值集合中的每个 x 计算 F(x)。

      或:

      var result = Enumerable.Range(0,4).Select(i => 4*i*i - 2*i + 8;
      

      【讨论】:

      • 也许这个问题有点模棱两可,但似乎 OP 想要选择 funcs 作为结果。你选择的方式,不是选择函数,而是选择函数的结果。例如,如果不执行 func,则无法获取结果的第一个元素。
      猜你喜欢
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多