C#
パターン①: AsEnumerable().Skip(offset).Take(pageSize)
出典: C# DataTable の大量行を Skip&Take でページングする3パターン — 1万行を1000件ずつ処理する設計 — パターン①: AsEnumerable().Skip(offset).Take(pageSize)
using System;
using System.Data;
using System.Linq;
var dt = new DataTable();
dt.Columns.Add("id", typeof(int));
dt.Columns.Add("name", typeof(string));
for (int i = 1; i <= 10000; i++) {
dt.Rows.Add(i, $"item-{i}");
}
int pageSize = 1000;
int totalPages = (dt.Rows.Count + pageSize - 1) / pageSize;
Console.WriteLine($"Total rows: {dt.Rows.Count}, pageSize: {pageSize}, totalPages: {totalPages}");
for (int page = 0; page < 3; page++) { // 先頭3ページだけサンプル表示
var rows = dt.AsEnumerable()
.Skip(page * pageSize)
.Take(pageSize)
.ToList();
Console.WriteLine($"Page {page}: rows={rows.Count}, first id={rows.First()["id"]}, last id={rows.Last()["id"]}");
}
▸ 実行ボタンで結果を表示
Source収録記事
この snippet は記事の「パターン①: AsEnumerable().Skip(offset).Take(pageSize)」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
2 件var dt = new DataTable(); dt.Columns.Add("id", typeof(int)); dt.Columns.Add("name", typeof(string)); for (int i = 1; i <= 10000; i++) {
▶ 実行可
パターン②: forループ+ Rows[i] (LINQ不使用・メモリ効率)
#d083059d494f
using System; using System.Data; using System.Linq;
▶ 実行可
パターン③: GroupBy((row, i)=> i / pageSize)で全ページ一括分割
#76f08f93fa36
