C# LINQ select子句中的Lambda函数

C# LINQ select子句中的Lambda函数,c#,linq,syntax,lambda,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[]>)

想象一下这样的代码:

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; };
由于我需要大量的“let”子句,我更喜欢使用第一种语法而不是第二种语法。我该怎么做?我只需要给
v
数组的第一项赋值(基于查询中的复杂计算),然后返回整个数组


不幸的是,有一种方法不能提供任何解决方案。我的印象是,编写查询的两种类型完全相同,因此我如何才能做到这一点?

我不认为您只能在查询中做到这一点。说明中说,它列出了
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);
如果不希望每次调用此函数时都生成新函数,还可以在查询外部定义一个委托,使用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);
delegate int[]MyDelegate(int[]x,int-y);

MyDelegate=(v,var1)=>{v[0]=var1;返回v;}// 我不认为只有在查询中才能做到这一点。说明中说,它列出了
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);
如果不希望每次调用此函数时都生成新函数,还可以在查询外部定义一个委托,使用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);
delegate int[]MyDelegate(int[]x,int-y);

MyDelegate=(v,var1)=>{v[0]=var1;返回v;}//IMHO,在linq表达式中改变输入值违背了linq的函数编程方面,也不一定是最好的主意。@JoachimIsaksson:你完全正确,除非你有数百万条记录和严格的性能要求。。。我可以用一堆.Concat(…).ToArray()做同样的事情,但那只是慢了几个数量级。IMHO,在linq表达式中改变输入值违背了linq的函数编程方面,也不一定是最好的主意。@JoachimIsaksson:你完全正确,除非你有数以百万计的记录和严格的性能要求。。。我可以用一堆.Concat(…).ToArray()做同样的事情,但那只是慢了几个数量级。啊,有趣的是,我也可以这样做:“让a=b.Select(x=>{x[0]=var1;return x})”和“Select a”:-D真是愚蠢syntax@Paya是啊,那也行。我认为不管你做什么,它都会看起来很难看:嗯,这很有趣,我也能做的是:“让a=b.Select(x=>{x[0]=var1;return x})”和“Select a”:-D多傻的一个词syntax@Paya是啊,那也行。我认为无论你做什么,它都会看起来很丑:P