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);
È stato utile?

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++;
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top