Nella seguente test:LINQ Skip enumera ancora elementi ignorati
int[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Func<int, int> boom = x => { Console.WriteLine(x); return x; };
var res = data.Select(boom).Skip(3).Take(4).ToList();
Console.WriteLine();
res.Select(boom).ToList();
Il risultato è:
1
2
3
4
5
6
7
4
5
6
7
Essenzialmente, ho osservato che in questo esempio, Skip()
e Take()
funzionano bene, Skip()
non è come pigro come Take(). Sembra che Skip()
annulli ancora gli elementi ignorati, anche se non li restituisce.
Lo stesso vale se faccio prima Take()
. La mia ipotesi migliore è che sia necessario enumerare almeno il primo salto o prendere, per vedere dove andare con il prossimo.
Perché lo fa?
Bene, 'Skip (n)' funziona richiedendo l'elemento successivo, 'n volte. Il prossimo elemento viene dalla tua selezione. Alcune raccolte potrebbero avere senso "saltare avanti", ma non tutte. Cosa succede se la raccolta è stata generata da un enumeratore personalizzato? – Rob
"Salta" non aumenta l'indice di 'n' o qualcosa del genere. 'Skip' sta semplicemente dicendo all'enumeratore" dare un elemento successivo "' n volte senza memorizzare questi valori in una matrice di risultati. –
@YeldarKurmangaliyev, penso che la tua spiegazione abbia più senso. @Rob, infatti, un enumeratore personalizzato che in realtà non ispeziona mai l'elemento pigro sarebbe meglio qui. Penso che sia così che Skip/Take dovrebbe funzionare. Ma l'iteratore in 'Where()' è ancora peggio. – ericosg