如何在 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 to
Select'
我尝试了下面的其他类似模式:
// 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;
我想在 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 to
Select'
我尝试了下面的其他类似模式:
// 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;