前回に引き続き、今回はDataRowに用意された拡張メソッドについて記述します。
.NET Framework 3.5になって、DataRowに以下の拡張メソッドが用意されました。
* Field
* SetField
尚、これらの拡張メソッドは、System.Data.DataRowExtensionsクラスに定義されています。
上記の拡張メソッドによって、別段新しい機能が追加されるわけではありません。
上記の拡張メソッド達は、以下のようにして使用します。
DataRow row = table.NewRow(); row.SetField("COL-1", 100); int val1 = row.Field ("COL-1");
つまり、フィールドの読み取り処理が型セーフになったという事になります。
今までは、
int val1 = (int) row["COL-1"];
のように、キャストが必要だった部分がなくなったって感じです。
これも、前回の拡張メソッドと同様に主にLinqで利用するために追加されたメソッドです。
Linqで処理を行う際に
where ((int) row["COL-1"]) >= 100
と書くよりも
where row.Field("COL-1") >= 100
と書ける方が記述性がいいです。
この拡張メソッド、当然普段の処理でも利用できます。
また、DataRowVersionを指定するタイプのオーバーロードも当然用意されています。
以下、サンプルです。
#region DataTableExtensionsSample-02 public class DataTableExtensionsSample02 : IExecutable{ public void Execute(){ DataTable table = BuildSampleTable(); // // 1列目の情報をint型で取得. // 2列目の情報をstring型で取得. // int val1 = table.Rows[0].Field("COL-1"); string val2 = table.Rows[0].Field ("COL-2"); PrintTable("Result:", table); // // 1列目の情報を変更. // table.Rows[0].SetField ("COL-1", 100); PrintTable("Result:", table); } DataTable BuildSampleTable(){ DataTable table = new DataTable(); table.BeginInit(); table.Columns.Add("COL-1", typeof(int)); table.Columns.Add("COL-2"); table.EndInit(); table.BeginLoadData(); for(int i = 0; i < 5; i++){ table.LoadDataRow(new object[]{i, (i + 1).ToString()}, true); } table.EndLoadData(); return table; } void PrintTable(string title, DataTable table){ Console.WriteLine(title); foreach(DataRow row in table.Rows){ Console.WriteLine("\t{0}, {1}", row[0], row[1]); } Console.WriteLine(); } } #endregion