Linq表达式具有多个输入参数

时间:2011-10-13 09:08:44

标签: c# .net 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。

3 个答案:

答案 0 :(得分:4)

junk是当前处理元素的索引 - 请参阅http://msdn.microsoft.com/en-us/library/bb548775.aspx

更具可读性和可靠性

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

答案 1 :(得分: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)   用于测试条件的每个源元素的函数; 函数的第二个参数表示源元素的索引。

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

答案 2 :(得分: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.