[C#]DataTableの値を一括置換する


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