Tampilan laporan biasanya dibagi per halaman, dan pengguna kadang hanya butuh bagian awal data. Operator partitioning memotong urutan tanpa mengubah elemennya: Skip melewati sejumlah elemen, Take mengambil sejumlah elemen, sedangkan versi *While memotong berdasarkan syarat.
Memotong dengan Skip dan Take #
Contoh berikut mengambil halaman kedua berisi dua produk termurah, lalu memotong daftar nilai dengan syarat:
record Produk(string Nama, string Kategori, int Harga, int Stok);
List<Produk> produk = new()
{
new Produk("Kopi Gayo", "Minuman", 25000, 40),
new Produk("Teh Melati", "Minuman", 15000, 60),
new Produk("Roti Bakar", "Makanan", 12000, 25),
new Produk("Susu UHT", "Minuman", 20000, 35),
new Produk("Keripik Singkong", "Makanan", 10000, 80)
};
var halamanDua = produk
.OrderBy(p => p.Harga)
.Select(p => p.Nama)
.Skip(2)
.Take(2);
Console.WriteLine("Halaman 2:");
foreach (string nama in halamanDua)
{
Console.WriteLine(nama);
}
int[] nilai = { 85, 90, 60, 45, 75 };
Console.WriteLine($"TakeWhile >= 70: {string.Join(" ", nilai.TakeWhile(n => n >= 70))}");
Console.WriteLine($"SkipWhile >= 70: {string.Join(" ", nilai.SkipWhile(n => n >= 70))}");Output yang Dihasilkan:
Halaman 2:
Teh Melati
Susu UHT
TakeWhile >= 70: 85 90
SkipWhile >= 70: 60 45 75Mari kita bedah baris demi baris:
.OrderBy(p => p.Harga): sumber disusun menaik lebih dulu agar potongan selalu deterministik..Select(p => p.Nama): projection mengubah elemen menjadi nama produk..Skip(2).Take(2): dua nama pertama dilewati, lalu dua nama berikutnya diambil — pola halaman kedua berukuran dua.TakeWhile(n => n >= 70): mengambil elemen dari depan selama syarat terpenuhi; iterasi berhenti pada60, sehingga75di belakang tidak ikut.SkipWhile(n => n >= 70): kebalikannya; elemen dilewati sampai syarat pertama kali gagal, lalu sisanya diambil semua.
Pola Paging dan Chunk #
Pola paging umum ditulis Skip((halaman - 1) * ukuran).Take(ukuran), dan panggilan OrderBy sebelum pemotongan wajib ada agar tiap halaman berisi data yang sama di setiap eksekusi. Dengan lima produk pada contoh, halaman kedua berukuran dua menghasilkan tepat dua nama karena sumbernya habis. Bila sumber lebih pendek dari yang diminta, Take mengembalikan sisa elemen tanpa error; Skip pun demikian, sehingga halaman terakhir yang tidak penuh tetap aman ditampilkan. Hasil keduanya juga tetap berupa referensi elemen asli, bukan salinan elemen baru.
.NET 6 menambahkan Chunk(ukuran) yang membagi urutan menjadi potongan-potongan berukuran tetap tanpa loop manual, serta TakeLast(n) dan SkipLast(n) yang mengambil atau melewatkan elemen dari ujung akhir.