如何在 C# 中的 `query-expression` 的 `select` 标记中使用 `lambda-expression`

How can I use a `lambda-expression` in the `select` tokens of a `query-expression` in C#

我想在 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)

error CS1942: An expression type in 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;

如何编码?

你可以使用这样的语法 select a Func<int, int>:

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()));

您必须选择是要使用方法语法还是查询语法。混合使用它们会使它们相当难读、难以掌握、难以测试和维护。

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

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;