Как переменная в выражении лямбда, учитывая ее значение
-
27-10-2019 - |
Вопрос
Как это 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++;
}
}