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で条件を追加するだけです。
簡単ですね。