DataTableのカラムをLINQを使って一発で更新する方法を示します
DataTableの列値を変更したい場合、foreachで行を繰返しながら変更するのが最初に思いつく方法です。
foreach (DataRow r in dt.Rows) { r["列名"] = "値"; }
でも、こんなことしなくてもLINQを使えば一発で置換できちゃいます。
以下の様なDataTableがあるとして話を進めます
F1 | F2 | F3 |
---|---|---|
A01 | B01 | C01 |
A02 | B02 | C02 |
A03 | B03 | C03 |
上記DataTableを生成するコードは以下です
var dt = new DataTable(); dt.Columns.Add("F1", typeof(string)); dt.Columns.Add("F2", typeof(string)); dt.Columns.Add("F3", typeof(string)); var row = dt.NewRow(); row["F1"] = "A01"; row["F2"] = "B01"; row["F3"] = "C01"; dt.Rows.Add(row); row = dt.NewRow(); row["F1"] = "A02"; row["F2"] = "B02"; row["F3"] = "C02"; dt.Rows.Add(row); row = dt.NewRow(); row["F1"] = "A03"; row["F2"] = "B03"; row["F3"] = "C03"; dt.Rows.Add(row);
列値を一括置換する
では、一括で更新してみます。
列”F2″の値をすべて “ZZZ” に更新コードは以下となります。
using System.Linq; using System.Xml.Linq; : : : : dt.AsEnumerable().Select(r => r["F2"] = "ZZZ") .ToList();
DataTable.AsEnumerableでLINQが使えるようにし、一括で更新しています。
一定の条件を満たす行の列値を一括置換する
列”F1″が”A02″又は”A03″の場合にのみ、列”F2″を”zzz”に更新する例です。
dt.AsEnumerable().Where(r => r.Field("F1") == "A02" || r.Field ("F1") == "A03") .Select(r => r["F2"] = "zzz") .ToList();
.Selectの前に .Whereで条件を追加するだけです。
簡単ですね。