想象一下像这样的代码:
return from pair in pairs.AsParallel()
let var1 = ... // var1 is typeof(int)
let var2 = ...
let var3 = ...
let var4 = ...
let var5 = ...
let var6 = ... // var6 is typeof(IEnumerable<int[]>)
from v in var6
select { v[0] = var1; return v; };
LINQ select子句不允许这种构造,但我可以使用普通的lambda select语句来做到这一点,如:
foo.Select(v => { v[0] = var1; return v; });
由于&#34;让&#34;我需要的条款,我更喜欢使用第一种语法而不是第二种语法。我怎样才能做到这一点?我只需要将一个值(基于查询中的复杂计算)分配给v
数组的第一项,然后返回整个数组。
有一个similar question,不幸的是它没有提供任何解决方案。我的印象是两种类型的查询都是完全等价的,所以我该怎么办呢?
答案 0 :(得分:4)
我认为你不能只在查询中这样做。说明here表示它列出了select
可能拥有的所有可能形式。同样,我知道你不能使用带有lambda表达式的let
。
有一种解决方法可以让您获得类似的结果。您可以创建一个单独的函数并在您的选择中调用它:
int[] MyFunc(int[] a, int var1)
{
a[0] = var1;
return a;
}
//In the query:
from v in var6
select MyFunc(v);
如果你不想在每次调用时都创建一个新函数,你也可以在查询之外定义一个委托,用lambda函数创建一个实例,并在查询中调用lambda函数。同样的方式。
delegate int[] MyDelegate(int[] x, int y);
MyDelegate del = (v, var1) => { v[0] = var1; return v; }; //<--lambda goes here
//Start query
return from pair in pairs.AsParralel()
...
from v in var6
select del(v, var1);
它看起来不太好,但它确实有用。