2013-05-30 155 views
0

任何人都可以解釋微軟的LINQ以下示例代碼...LINQ示例代碼...

我無法理解lambda表達式的(位,指數)部分:

public void Linq5() 
{ 
    string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; 

    var shortDigits = digits.Where((digit, index) => digit.Length < index); 

    Console.WriteLine("Short digits:"); 
    foreach (var d in shortDigits) 
    { 
     Console.WriteLine("The word {0} is shorter than its value.", d); 
    } 
} 
+0

你檢查哪裏的文件?它是[trivially found](http://msdn.microsoft.com/zh-cn/library/bb549418.aspx)。做了些什麼沒有意義? –

+0

我做檢查的文件...但我不知道如何 公共靜態的IEnumerable ( \t這IEnumerable的源, \t Func鍵謂詞 ) 成爲 的IEnumerable query = numbers.Where((number,index)=> number <= index * 10); – Craig

回答

2

我無法理解(數字,索引)lambda表達式的一部分:

有兩種過載情況以Where。一個將謂詞映射的序列類型實例映射到bool,另一個將謂詞映射對(序列類型的實例,序列中的索引)映射到bool。這是這樣你就可以說像

sequence.Where((x, index) => index % 2 == 0 && x.Length > 5)) 

事情就是:給我的序列中的所有項目甚至索引和長度超過5

在這個例子中:

digits.Where((digit, index) => digit.Length < index); 

我們的意思是:給我所有序列中項目長度小於它在序列中的位置的項目,即所有長度小於它所代表的值的數字。

+0

偉大的答案謝謝! – Craig

1

這些是lambda表達式的參數。

編譯器將根據lambda被用作的委託來推斷它們的類型。
在這種情況下,這是從Where()過載Func<T, int, bool>

1

Lambda表達式是一個快捷方式編寫psedocode:

bool FunctionWithNoName(string digit, int index) 
{ 
return (digit.Length < index); 
} 
+0

在這種情況下,index是否已經被定義?我想如果我在這裏使用foo,這是行不通的。 – Craig

+0

不,索引只是函數參數的名稱。術語索引在這裏是任意的,你可以使用任何東西,就像你使用任何函數一樣。 – Rikalous

+0

這已點擊到位!感謝您的幫助......我只是在MSDN網站上掙扎......我無法理解這一點...... 公共靜態的IEnumerable ( \t這IEnumerable的源, \t Func鍵 predicate ) – Craig