2011-10-13 25 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