C#
パターン2: GroupBy +集計(Sum / Count / Average)
出典: C# DataTable を LINQ でフィルタ・GroupBy・分割する3パターン — パターン2: GroupBy +集計(Sum / Count / Average)
//カテゴリ別の件数と合計金額
var summary = dt.AsEnumerable()
.GroupBy(r => r.Field<string>("category"))
.Select(g => new
{
Category = g.Key,
Count = g.Count(),
TotalPrice = g.Sum(r => r.Field<int>("price")),
AvgPrice = g.Average(r => r.Field<int>("price"))
})
.OrderByDescending(x => x.TotalPrice)
.ToList();
foreach (var s in summary)
{
Console.WriteLine($"{s.Category}: {s.Count}件/合計{s.TotalPrice} /平均{s.AvgPrice:F0}");
}
▸ 実行ボタンで結果を表示
Source収録記事
この snippet は記事の「パターン2: GroupBy +集計(Sum / Count / Average)」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。
同じ記事から
10 件// ❌これは動かない var actives = dt.Where(r => r["IsActive"].ToString()== "1"); // ↑ 'DataTable'に'Where'の定義はない未収録
var actives = dt.Where(r => r["IsActive"].ToString()== "1");
#26dc8b3f4917
using System.Data; using System.Linq; // using System.Data.DataSetExtensions; // .NET Framework 4.0以降は標準で参照済みのはず未収録
前提:AsEnumerable()でIEnumerable化する
#a9874e6cceab
//価格1000以上、かつ"在庫あり"のフラグが立ってる行を抽出 var filtered = dt.AsEnumerable() .Where(r => r.Field<int>("price")>= 1000 && r.Field<bool>("in_stock"));
▶ 実行可
パターン1:フィルタ(Where)
#4d40bef0f3f9
//価格1000以上の行だけ別DataTableに分割 var highPriceRows = dt.AsEnumerable() .Where(r => r.Field<int>("price")>= 1000);未収録
パターン3:分割(CopyToDataTable / ImportRow)
#59d35ff0dae0
DataTable dtCopy = dt.Clone(); //スキーマだけコピー foreach (var r in highPriceRows) { dtCopy.ImportRow(r);未収録
パターン3:分割(CopyToDataTable / ImportRow)
#7a058a47bdcf
// ❌ NG: NULL許容な列にField<int>を使うとNULL行で例外 var prices = dt.AsEnumerable() .Select(r => r.Field<int>("amount"))// amountがNULLの行で例外(Typed DataSetならStrongTypingException、一般ADO.NETではInvalidCastException) .ToList();未収録
DBNullのハマり:Field vs Field<int?>
#765e4bcb985a
