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

时间:2018-12-29 08:11:40

标签: c# linq select lambda capture

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

  // 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 to选择'

中的表达式类型

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

  // 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;

我怎么编码?

2 个答案:

答案 0 :(得分:1)

您可以使用以下语法来选择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()));

答案 1 :(得分:0)

您必须选择要使用方法语法还是查询语法。混合使用它们会使它们变得非常难以阅读,难以掌握,难以测试且难以维护。

使用方法语法时,查询将很容易:

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;