- PR -

DataTableから特定のカラムを抽出して別途DataTableを作成したい

1
投稿者投稿内容
槇田(仮)
会議室デビュー日: 2006/12/08
投稿数: 4
投稿日時: 2006-12-08 17:24
はじめまして。槇田(仮)と申します。

現在Visual Studio 2005上にてC#による開発を行っており
次のような処理を記述しています。


(1)共通関数を用いて、以下のようなDBからIDをキーとして一致した全てのレコードを取得します。
  (共通関数の戻り値はDataTable型です)

┌─┬──┬──┬───┬──┬────┐
|ID|name|post|result|……|comment |
├─┼──┼──┼───┼──┼────┤
|01|taro|1001|+64000|……|********|
├─┼──┼──┼───┼──┼────┤
|02|jiro|1002|-15000|……|@@@@@@@@| (1レコード28項目)

(2)取得したDataTableから、必要なカラムのみを抽出して新規DataTableを作成します。

(3)別途取得されたDataTableと照合してさまざまな処理を行います。


この(2)の必要なカラムのみを抽出」するという処理を実行する際に、現在は
以下のような記述でまかなっているのですが、冗長に思えますので
記述を短縮したいと考えております。

/*---------------------------------------------

DataTable table_A = kyoutsuKansuu(placeID);
DataTable table_B = new DataTable();

table_B.Columns.Add("ID", Type.GetType("System.String"));
/* 中略〜必要な項目を追加しています */
table_B.Columns.Add("hogehoge", Type.GetType("System.hogehoge"));

for (int index = 0; index < table_A.Rows.Count; idx++)
{
  table_B.Rows.Add( table_B.NewRow());
  table_B.Rows[index]["name"] = table_A.Rows[index]["name"];
     …
  table_B.Rows[index]["hogehoge"] = table_A.Rows[index]["hogehoge"];


 ---------------------------------------------*/

この場合、例えばDataView.RowFilterプロパティで特定の行を抽出する時のように
特定のカラムを一括して抽出可能な方法はありますでしょうか。
よろしければご教示頂きたいと思います。宜しくお願いします。


 編集履歴:2006/12/08 17:28PM
 表の表記崩れを修正しました。
 誤記「DataView.RowFilterメソッド」を修正しました。

[ メッセージ編集済み 編集者: 槇田(仮) 編集日時 2006-12-08 17:28 ]
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-12-08 17:48
DataView 使えばいいんじゃないかとか SQL 投げなおした方が手っ取り早そうとか思いましたが。

お望みの機能は(3 つに分割されて)全部 DataTable クラスに用意されてるような。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2006-12-08 17:48
データテーブルを丸ごとコピーして不要な列を削除するとか。

DataTable table_B = table_A.Copy();
table_B.Columns.Remove("不要な列");

[ メッセージ編集済み 編集者: todo 編集日時 2006-12-08 17:50 ]
槇田(仮)
会議室デビュー日: 2006/12/08
投稿数: 4
投稿日時: 2006-12-09 00:19
お答え頂きありがとうございます。

>Hongliang さん
>お望みの機能は(3 つに分割されて)全部 DataTable クラスに用意されてるような。
とのご指摘を頂き、msdnを読み返した結果、DataTable.Selectメソッドを用いて
Select("ID, name,…")として取得したDataRow配列をDataTableにセットすることで
より短い記述での特定カラムの抽出処理を実現できました。
質問の前に読み込んだつもりでしたが斜め読みで読んだつもりになっていたようで、反省しております。

>todo さん
>データテーブルを丸ごとコピーして不要な列を削除するとか。
「列を削る」という方法は目から鱗でした。
処理によっては数項目除外するのみでほぼそのまま使うという場面もあり、
Selectの実行速度(多少遅く感じます)との兼ね合いによっては
Remove(〜)による列の削減も選択肢として開発していきたいと思います。

ありがとうございました。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2006-12-09 06:30
引用:

>お望みの機能は(3 つに分割されて)全部 DataTable クラスに用意されてるような。
とのご指摘を頂き、msdnを読み返した結果、DataTable.Selectメソッドを用いて
Select("ID, name,…")として取得したDataRow配列をDataTableにセットすることで
より短い記述での特定カラムの抽出処理を実現できました。


DataViewのToTableメソッドを使うともっと簡単にできるのでは?

Dim Columns As String() = {"ProductID", "ProductName"}
Dim dt As DataTable = DataView.ToTable("SmallCustomers",False,Columns)

_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
1

スキルアップ/キャリアアップ(JOB@IT)