lambda表达式中的变量如何赋值

时间:2011-01-29 17:49:03

标签: c# linq lambda extension-methods generic-method

以下示例中的index如何获取其值?我理解n是从源numbers自动获得的,但是,虽然含义很明确,但我没有看到索引是如何赋值的:

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

TakeWhile的签名是:

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

3 个答案:

答案 0 :(得分:4)

此版本的TakeWhile提供序列中源元素的索引作为谓词的第二个参数。即谓词被称为谓词(5,0),然后是谓词(4,1),谓词(1,2),谓词(3,3)等。参见the MSDN documentation

还有一个“更简单”的函数版本,仅提供序列中的值,请参阅MSDN

答案 1 :(得分:2)

索引是由TakeWhile的实现生成的,可能看起来有点像this

答案 2 :(得分:1)

只要您弄清楚TakeWhile的实施方式,事情就会变得清晰:

public static IEnumerable<TSource> TakeWhile<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate)
{
    int index = 0;
    foreach (TSource item in source)
    {
        if (predicate(item, index))
        {
            yield return item;
        }
        else
        {
            yield break;
        }
        index++;
    }
}