C#
パターン③: GroupBy((row, i)=> i / pageSize)で全ページ一括分割
出典: C# DataTable の大量行を Skip&Take でページングする3パターン — 1万行を1000件ずつ処理する設計 — パターン③: GroupBy((row, i)=> i / 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;
var pages = dt.AsEnumerable()
.Select((row, i) => new { row, i })
.GroupBy(x => x.i / pageSize)
.ToList();
Console.WriteLine($"Total pages: {pages.Count}");
foreach (var page in pages.Take(3)) {
var rows = page.Select(x => x.row).ToList();
Console.WriteLine($"Page {page.Key}: rows={rows.Count}, first id={rows.First()["id"]}, last id={rows.Last()["id"]}");
}
▸ 実行ボタンで結果を表示
Source収録記事
この snippet は記事の「パターン③: GroupBy((row, i)=> i / pageSize)で全ページ一括分割」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
2 件using System; using System.Data; using System.Linq;
▶ 実行可
パターン①: AsEnumerable().Skip(offset).Take(pageSize)
#36a8c2d13d9e
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
