Skip / Take (paginare) în C# (.NET)

LINQ (Language Integrated Query) .NET Framework 3.5 (TakeLast/SkipLast: .NET Core 2.0)

Take ia primele n elemente, Skip le sare; împreună fac paginare. TakeWhile/SkipWhile se opresc la prima condiție falsă.

Sintaxă C#
sursa.Skip((pagina - 1) * marime).Take(marime)   sursa.TakeWhile(x => ...)

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 de Skip, ordinea rândurilor nu e garantată și aceleași înregistrări pot apărea pe două pagini.
  • Confuzia între TakeWhile și Where: TakeWhile se 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ă.