LINQ select子句中的Lambda函数

本文关键字:Lambda 函数 select 子句 LINQ | 更新日期: 2023-09-27 18:04:50

想象这样的代码:

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; });

因为我需要大量的"let"子句,所以我更愿意使用第一种语法而不是第二种语法。我该怎么做呢?我只需要分配一个值(基于查询中的复杂计算)到v数组的第一项,然后返回整个数组。

有一个类似的问题,不幸的是没有提供任何解决方案。在我的印象中,这两种类型的查询都是完全等价的,那么我该怎么做呢?

LINQ select子句中的Lambda函数

我不认为你只能在查询中做到这一点。这里的描述说它列出了select可能有的所有形式。同样,我知道你不能使用let与lambda表达式。

有一个变通方法可以让您得到类似的结果。你可以创建一个单独的函数并在select:

中调用它
int[] MyFunc(int[] a, int var1)
{
    a[0] = var1;
    return a;
}
//In the query:
from v in var6
select MyFunc(v);

如果你不想每次调用this都创建一个新函数,你也可以在查询之外定义一个委托,用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);