2011-06-21 78 views
1

我正在學習LINQ和一本書橫跨下面的代碼來:在LINQ中「(n,index)=> n> = index」是什麼意思?

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 
var firstBigNumbers = numbers.TakeWhile((n,index)=>n>=index); 

什麼是(n,index)

我遇到了() =>,這意味着一個不帶參數的lambda表達式。

現在的問題是:lambda表達式可以使用多少個參數?如何決定在我的代碼中寫入的參數數量?

+8

你是指'(n,index)=> n> = index'? – LukeH

+2

你從哪裏找到示例代碼? – BoltClock

+0

是@ LukeH,作出更正 –

回答

5

(n, index)是lambda表達式的參數。在這種情況下,它們代表集合中的一個集合項目及其索引。這可以從TakeWhile方法的簽名中推斷:

public static IEnumerable<TSource> TakeWhile<TSource>(
    this IEnumerable<TSource> source, 
    Func<TSource, int, bool> predicate 
) 

Lambda表達式(n,index) => n >= index表示謂詞:TakeWhile將繼續產生項目,而這謂詞被滿足。

+1

+1措辭非常精準。太好了! –

1

(N,索引)

是λ表達式(代替函數定義)的參數列表。

N =>索引

將是功能體(表達體要精確)。在這種情況下,它是錯誤的,因爲它會返回另一個lambda,其參數類型不能被推斷出來,也不能被轉換爲'bool'。 TakeWhile接受Func<bool>所以它不會編譯。

這使得更多的意義:

numbers.TakeWhile((n,index)=> n>=index) 
1

的代碼你目前並沒有太大的意義,因爲lambda表達式(n,index)=>(n=>index)(添加爲清楚起見括號)返回另一個Lambda表達式會從N(中值列表)到列表中的(索引)位置。正如人們所說的,你可能意味着(n,index) => (n >= index)

1

如果你看一下TakeWhile的文檔,你會發現你正在尋找的參數是具有以下簽名謂詞:

Func<TSource, int, bool> predicate 

的Func鍵部分指出您可以提供一個代表,其採用類型爲TSource的對象和一個整數,該整數是列表中項目的索引,並返回一個布爾值。這允許您根據其索引和某些條件過濾列表中的項目。

它看起來像你的代碼有一個錯字,應該改成:

TakeWhile((n,index) => n > index) 

這將返回整數,直到超過給定列表內的索引中的第一個。

2

簡而言之,它意味着返回大於(或等於)它們在數組中的位置的所有數字,直到找到一個不適合的數字爲止。即它只是返回前兩個(54)。

編輯:只要添加,如果你想得到所有這樣的數字(即不是第一次遇到一個不適合的第一次),你可以將TakeWhile更改爲Where

例如

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 
var allBigNumbers = numbers.Where((n, index) => n >= index); 

返回5,4,3,9,8,6,7(記住它是一個從零開始的數組,因此3被返回)。我將它重新命名爲allBigNumbers,所以它很有意義!