DataTableのデータをグループ化したかったんですが、ワンタッチでできる方法はないようです。
で、探してると、yan note: .NET DataTableをグループ化し集計するにはにどんぴしゃな方法が載ってました。
一旦 DataTable を DataView に変換して、DataView.ToTableメソッドを使うと重複行を取り除いた DataTable を作成できるようです。
そして、重複行がないDataTableを行単位でループし、DataTable.Computeメソッドを使って集計値を求めるやる方法のようです。
参考先にもサンプルコード載せられていますが、C#に書き直したものを載せておきます。
//DataTable作成DataTable tblTest = new DataTable("TestTable");
tblTest.Columns.Add(new DataColumn("name"));
tblTest.Columns.Add(new DataColumn("model"));
tblTest.Columns.Add(new DataColumn("price"));
tblTest.Columns["price"].DataType = Type.GetType("System.Int32");
//テストデータ追加
tblTest.Rows.Add(new object[] { "CPU", "Core i5 750", 18000 });
tblTest.Rows.Add(new object[] { "CPU", "Core i7 860", 25000 });
tblTest.Rows.Add(new object[] { "メモリ", "DDR3 2GB*2", 10000 });
tblTest.Rows.Add(new object[] { "メモリ", "DDR2 2GB*2", 8000 });
//重複を除去するため DataView を使う
DataView vw = new DataView(tblTest);
//重複除去を第二引数に指定。第三引数で一意とすべき列を指定。(複数列でも可能)
DataTable tblRes = vw.ToTable("DistinctTable",true, new string[] {"name"});
//合計の列を追加
tblRes.Columns.Add("sumPrice");
//重複除いたDataTableをループし、元のDataTableから集計値を求める
foreach (DataRow row in tblRes.Rows)
{
row["sumPrice"] = tblTest.Compute("SUM(price)", "name = '" + row["name"] + "'");
}
foreach (DataRow row in tblRes.Rows)
{
Console.WriteLine(row["name"] + ":" + row["sumPrice"]);
}
結果はこうなります。
CPU:43000
メモリ:18000
参考: