我想在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;
我怎么编码?
答案 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;