Ce face Skip / Take (paginare)
Take(n) întoarce primele n elemente, iar Skip(n) tot ce urmează după ele. Combinate, Skip((pagina - 1) * marime).Take(marime) dau o pagină de rezultate; în Entity Framework Core devin OFFSET/LIMIT în SQL. Un n mai mare decât numărul de elemente nu dă eroare.
TakeLast(n) și SkipLast(n) lucrează de la coadă. TakeWhile ia elemente cât timp condiția e adevărată și se oprește definitiv la primul element care nu o respectă; SkipWhile le sare până atunci și întoarce restul, inclusiv elementele de după care ar respecta din nou condiția.
Parametri
| Parametru | Descriere |
|---|---|
count |
Numărul de elemente luate sau sărite. Valorile negative sunt tratate ca 0. |
predicate |
La TakeWhile/SkipWhile: condiția verificată element cu element. |
Ce returnează
Un IEnumerable<T> evaluat leneș (la parcurgere).
Exemple
Exemplul 1: Paginare
var produse = Enumerable.Range(1, 10).Select(i => $"P{i}").ToList();
int marime = 3;
for (int pagina = 1; pagina <= 4; pagina++)
{
var bucata = produse.Skip((pagina - 1) * marime).Take(marime);
Console.WriteLine($"Pagina {pagina}: {string.Join(", ", bucata)}");
}
Console.WriteLine($"Ultimele: {string.Join(", ", produse.TakeLast(2))}");
Rezultat
Pagina 1: P1, P2, P3
Pagina 2: P4, P5, P6
Pagina 3: P7, P8, P9
Pagina 4: P10
Ultimele: P9, P10
Exemplul 2: TakeWhile și SkipWhile
TakeWhile se oprește la 12; valoarea 9 de după nu mai este luată, deși e sub prag.
int[] temperaturi = [2, 4, 7, 12, 9, 15, 3];
Console.WriteLine(string.Join(", ", temperaturi.TakeWhile(t => t < 10)));
Console.WriteLine(string.Join(", ", temperaturi.SkipWhile(t => t < 10)));
Console.WriteLine(string.Join(", ", temperaturi.Where(t => t < 10)));
Rezultat
2, 4, 7
12, 9, 15, 3
2, 4, 7, 9, 3
Greșeli frecvente
- Paginare fără ordonare într-o bază de date: fără
OrderByînainte deSkip, ordinea rândurilor nu e garantată și aceleași înregistrări pot apărea pe două pagini. - Confuzia între
TakeWhileșiWhere:TakeWhilese oprește la primul element care nu respectă condiția.
Comenzi înrudite
Chunk: Împarte o secvență în tablouri de câte n elemente; ultimul grup poate fi mai mic. Util pentru loturi și afișare pe rânduri.EF Core: interogări (Where, Include, AsNoTracking): Interogările LINQ pe DbSet devin SQL: Where, Select, Include pentru relații, AsNoTracking pentru citire și ExecuteUpdate în masă.