簡體   English   中英

LINQ select子句中的Lambda函數

[英]Lambda function in LINQ select clause

想象這樣的代碼:

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數組的第一項分配一個值(基於查詢中的復雜計算),然后返回整個數組。

有一個類似的問題 ,不幸的是沒有提供任何解決方案。 我的印象是兩種編寫查詢的方式都是完全相同的,那么我該怎么做呢?

我認為您不能僅在查詢中執行此操作。 這里的說明說,它列出了select可以具有的所有可能形式。 同樣,我知道您不能將let與lambda表達式一起使用。

有一種解決方法可讓您獲得相似的結果。 您可以創建一個單獨的函數,然后在您選擇的函數中調用它:

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

看起來不太好,但是可以用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM