Как переменная в выражении лямбда, учитывая ее значение

StackOverflow https://stackoverflow.com/questions/4838419

Вопрос

Как это 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);
Это было полезно?

Решение

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

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

Другие советы

Индекс генерируется внедрением 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++;
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top