LINQ select子句中的Lambda函数

时间:2014-05-24 12:54:22

标签: 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; };

LINQ select子句不允许这种构造,但我可以使用普通的lambda select语句来做到这一点,如:

foo.Select(v => { v[0] = var1; return v; });

由于&#34;让&#34;我需要的条款,我更喜欢使用第一种语法而不是第二种语法。我怎样才能做到这一点?我只需要将一个值(基于查询中的复杂计算)分配给v数组的第一项,然后返回整个数组。

有一个similar question,不幸的是它没有提供任何解决方案。我的印象是两种类型的查询都是完全等价的,所以我该怎么办呢?

1 个答案:

答案 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);

它看起来不太好,但它确实有用。