Pay*_*aya 1 c# linq syntax lambda
想象一下这样的代码:
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; };
Run Code Online (Sandbox Code Playgroud)
LINQ select 子句不允许这种构造,但我可以使用普通的 lambda select 语句来做到这一点,例如:
foo.Select(v => { v[0] = var1; return v; });
Run Code Online (Sandbox Code Playgroud)
由于我需要大量的“let”子句,我更愿意使用第一种语法而不是第二种。我怎样才能做到这一点?我只需要为v数组的第一项分配一个值(基于查询中的复杂计算),然后返回整个数组。
不幸的是,有一个类似的问题没有提供任何解决方案。我的印象是两种类型的查询都是完全等效的,那么我该怎么做呢?
小智 5
我认为您不能仅在查询中执行此操作。这里的描述说它列出了 aselect可以具有的所有可能形式。同样,我知道你不能使用let与 lambda 表达式一起使用。
有一种解决方法可以让您获得类似的结果。您可以创建一个单独的函数并在您的选择中调用它:
int[] MyFunc(int[] a, int var1)
{
a[0] = var1;
return a;
}
//In the query:
from v in var6
select MyFunc(v);
Run Code Online (Sandbox Code Playgroud)
如果不想每次调用都创建一个新函数,也可以在查询之外定义一个委托,用一个 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);
Run Code Online (Sandbox Code Playgroud)
它看起来不太好,但它有效。