Как переменная в лямбда-выражении, учитывая ее значение - PullRequest
4 голосов
/ 29 января 2011

Как index в приведенном ниже примере получить его значение? Я понимаю, что n автоматически получается из источника numbers, но, хотя смысл понятен, я не вижу, как index дается его значение:

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 ]

4 голосов
/ 29 января 2011

Эта версия TakeWhile предоставляет индекс исходного элемента в последовательности в качестве второго параметра предиката. То есть предикат называется предикатом (5, 0), затем предикатом (4, 1), предикатом (1, 2), предикатом (3, 3) и т. д. См. документацию MSDN .

Существует также «более простая» версия функции, предоставляющая только значения в последовательности, см. MSDN .

2 голосов
/ 29 января 2011

Индекс создается реализацией TakeWhile, которая может выглядеть немного как this .

1 голос
/ 27 мая 2011

Все становится понятным, пока вы выясняете, как можно реализовать 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++;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...