2011-10-13 23 views
1

我寫了下面的代碼,我無法理解它是如何執行的。Linq表達式與多個輸入參數

class Program 
{ 
    static void Main(string[] args) 
    { 
     int[] nums = { 1, 5, 10, 3, 554, 34}; 
     var nn = nums.TakeWhile((n, junk) => n > junk); 
     nn.Count(); 
     foreach (var a in nn) 
     { 
      Console.WriteLine(a); 
     } 
     Console.ReadKey(); 
    } 
} 

首先,我寫了TakeWhile表達式作爲n => n > 5。我能夠理解這一點。但我只是增加了一個參數junk。什麼是垃圾?在查詢期間分配給它什麼值?它是如何給出輸出爲1,5和10.

+0

我的壞。期待在MSDN中有一個表格,每一個重載解釋每一個參數。不要讀你們引用的那些句子。 – NLV

回答

3

junk是當前處理的元素的索引 - 見http://msdn.microsoft.com/en-us/library/bb548775.aspx

更可讀和understable將是

var nn = nums.TakeWhile((n, index) => n > index); 
+0

似乎有點奇怪的謂詞「儘管價值大於索引」 –

+0

是的,但是這種包括索引作爲參數的一般形式有其用途...想象一種情況,您需要考慮元素的位置以考慮更復雜的條件... – Yahia

+0

是的,我同意它有它的用途,即使這使用我是有效的,我只是不知道是什麼原因,它似乎有點奇怪。 –

2

嘗試使用「正確的」名稱:var nn = nums.TakeWhile((n, index) => n > index);它會很清楚!

TakeWhile頁:predicate Type: System.Func<TSource, Int32, Boolean> A function to test each source element for a condition;the second parameter of the function represents the index of the source element.

+0

甚至不知道第二個參數是什麼。這是我的問題。因此,在不知道的情況下正確命名是不可能的。正如我所說我錯過了MSDN引用的那些行。期待一個重載方法表,其所有參數解釋:)。 – NLV

+0

@NLV如果你正在使用Visual Studio,編寫'nums.TakeWhile('並按向下箭頭查看第二個重載,你將得到的描述是謂詞:一個函數來測試每個源元素的條件;函數的第二個參數表示源元素的索引。「(和」正確的「名稱是一個笑話......關鍵是」正確的「名稱是解釋:-)) – xanatos

3

junk是該指數。所以你要遍歷是:

(1, 0) => true 
(5, 1) => true 
(10, 2) => true 
(3, 3) => false => abort 

您正在使用的方法簽名是:

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

謂詞
類型:System.Func(Of TSource, Int32, Boolean) A到測試每個源元素功能一個條件; 函數的第二個參數表示源元素的索引。

http://msdn.microsoft.com/en-us/library/bb548775.aspx