「DataTableのある特定の行を抽出し、その結果を格納したDataTableを作る」という操作が必要になった。
何も悩む所は無いと思ったのだが、意外と何回も失敗し、最終的にカンニングをしたので、備忘録として書き記す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//ここからDataTableを作成してるだけ DataTable dt = new DataTable(); dt.Columns.Add("col1"); dt.Columns.Add("col2"); dt.PrimaryKey = new DataColumn[] { dt.Columns[0] }; for (int i = 0; i < 10; i++) { DataRow dr = dt.NewRow(); dr["col1"] = i.ToString(); dr["col2"] = i.ToString()+"回目に追加された行です。"; dt.Rows.Add(dr); } //ここまでDataTableを作成しているだけ //Selectで抽出した結果を新しいDataTableとして格納したい。 DataRow[] drs = dt.Select("col1='3' or col1='5'"); DataTable newdt = dt.Clone(); foreach (var dr in drs) { //newdt.Rows.Add(dr)ではダメ。 //drはdtに所属している行なので、別のDataTableであるnewdtにはAddできない。 //よって、newdtの新しい行を作成し、その各列の値をdrと全く同じにし、それをnewdtに追加すれば良い。 DataRow newrow = newdt.NewRow(); newrow.ItemArray = dr.ItemArray; newdt.Rows.Add(newrow); } |
つまり、DataRowはDataTableに所属するオブジェクトなので、
違うDataTableに追加するには全く新しい行を作成して追加しなくてはいけないということ。
もっとスマートにできないのかな。
わざわざSelectしたものをさらにDataTableにするというのがそもそもスマートじゃないのかもしれない。