質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

7197閲覧

DataTableに新しい列を値ごと結合したい

Taishi2002

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/07/24 04:47

編集2018/07/24 05:28
ID名前身長
1田中170
2木村160

というテーブルAに

ID体重
150
240

というテーブルBを結合して

ID名前身長体重
1田中17050
2木村16040

というテーブルにしたいです。

今は行ごとのループで列に値を追加していますが、数万行あるため非常に時間が掛かっています。
パフォーマンスの良い方法はないでしょうか。

追記
今の処理

  1. テーブルAへ列:体重を追加(Columm.Add)
  2. テーブルAのRowでループ(ForEach)

2.1. TableA(i)("体重")=TableB(i)("体重")

です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/07/24 04:55

今はどのようにしているのかコードを記述してください。
Taishi2002

2018/07/24 05:20

フレームワーク上で処理を作っているためコードを記載することはできないのですが、処理の流れを追記致します。
Zuishin

2018/07/24 05:27

ID が昇順で 1 ずつ増え、抜けがないことが両テーブルで保証されていますか?
Taishi2002

2018/07/24 05:29

はい。保証されています。両テーブルのIDは完全に一致します。
guest

回答3

0

元になる DataTable はどのように作っているのですか?

数万行ということは SQL Server などのデータベースから ADO.NET を利用して作成しているのではないかと想像していますが、もしそうであれば JOIN 句を使った SELECT クエリで直接データベースから目的の DataTable を作ってはいかがですか?

投稿2018/07/24 05:06

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Taishi2002

2018/07/24 05:19

残念ながらExcelを読み込んでいます。 C#で作成されたフレームワークのようなものの上で動作しており、ExcelをDataTable型で読み込む処理はフレームワークの部品を使用しています。
退会済みユーザー

退会済みユーザー

2018/07/24 05:22 編集

EXCEL からでも ADO.NET と JOIN した SELECT クエリを使ってできると思うのですが? 質問者さんの方でやってみてできなかったということでしょうか?
退会済みユーザー

退会済みユーザー

2018/07/24 05:33

Excel ファイルが違うとダメかもしれませんね。ADO.NET + JOIN 句の SELECT クエリがダメだとすると、質問者さんが今使っているコードより早いかどうかは分かりませんが、LINQ を使って JOIN するという方法があります。検討されてはいかがですか?
guest

0

状況が分からないので何とも言えないけど、
0. 手作業か何かでExcelからDBに各テーブルのデータを移行する
0. DBからはSQLで頑張る
正直DataTableは重いのでお勧めできないし、Excelからデータを拾ってってのも厳しいと思うので、可能ならこの手段が良いとは思う
それが難しいならZuishinさんの提案通りにDataTableからList<T>へ作り直してからLinqでJOINの方が速いと思う
DataTableは内部がobjectなので一々キャストして処理してるので

なお、DBから取得する場合は個人的にはDapperさんがおすすめ

IDが重複しないのなら以下のやり方でもありかもしれないけど、
作ったデータもDataTableにしないといけないとなるとListにしてPersonのIDのコメントを外して
.First(r => r.ID == row.Field<int>("ID"))で対象のインスタンスを拾って体重を設定した後、
最後にList<>を.ToDataTable()する感じかな?

C#

1//以下のクラスを定義しておいて 2public class Person 3{ 4 //public int ID{get;set;} 5 public string 名前{get;set;} = string.Empty; 6 public double 身長{get;set;} = 0.0; 7 public double 体重{get;set;} = 0.0; 8} 9 10//Dictionaryに設定していく 11var dic = new Dictionary<int, Person>(); 12 13foreach(var row in tableA) 14{ 15 dic[row.Field<int>("ID")] = new Person 16 { 17 名前 = row.Field<string>("名前"), 18 身長 = row.Field<double>("身長") 19 }; 20} 21 22foreach(var row in tableB) 23{ 24 var p = dic[row.Field<int>("ID")]; 25 p.体重 = row.Field<double>("体重"); 26} 27

投稿2018/07/24 15:31

編集2018/07/24 15:54
len_souko

総合スコア1348

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

カラム名「体重」でのアクセスを序数でのアクセスに変えれば速くなると思いますが、DataTable を使う限りそれ以上にはならないと思います。
あとカウンタ変数 i を使っているので foreach を for に直すことで少し最適化できるような気もしますが、これはほとんど気休め程度でしょう。
DataTable よりももっと軽量なクラスを自作して使うと改善すると思います。

意外と遅い DataTable 、なので List を使うと 5 倍早くなる

投稿2018/07/24 05:42

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問