Come è una variabile in un'espressione lambda dato il suo valore
-
27-10-2019 - |
Domanda
In che modo index
nell'esempio seguente ottiene il suo valore? Capisco che n è ottenuto automaticamente dalla numbers
fonte, ma, mentre il significato è chiaro, io non vedo come indice è dato il suo valore:
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var firstSmallNumbers = numbers.TakeWhile((n, index) => n >= index);
La firma di TakeWhile
è:
public static IEnumerable<TSource> TakeWhile<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate);
Soluzione
Questa versione TakeWhile fornisce l'indice dell'elemento sorgente nella sequenza come secondo parametro al predicato. Cioè il predicato è chiamato come predicato (5, 0), allora predicato (4, 1), predicato (1, 2), predicato (3, 3), etc. la documentazione MSDN .
C'è anche una versione “semplice” della funzione, fornendo solo i valori nella sequenza, vedere MSDN .
Altri suggerimenti
L'indice è generato dalla realizzazione di TakeWhile
, che potrebbe sembrare un po 'come questo .
cose diventano chiare finché a capire come TakeWhile può essere implementata:
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++;
}
}