データテーブルへの行追加について

こんにちは

データテーブルを「変数」でフィルタして得た結果を別のテーブルに
ループして書き出そうとしたところ、上書きされ最後の結果のみが出力されました。
別のテーブルに行を追加して書き出す方法をご教示お願いいたします。

【ループさせる参照元データテーブル(row)】
Column0
AA
CC

【フィルタしたいデータテーブル(DataTable1)】
Column0
AA
BB
CC
DD
AA
AA
BB

【使用した代入の式】
DataTable2 =
(from dr as datarow in DataTable1 where dr.item(“Column0”).tostring.trim.Equals(row(0)) select dr).CopyToDataTable

【実行結果(DataTable2)】
Column0
CC

【期待する実行結果(DataTable2)】
Column0
AA
AA
AA
CC

お知恵を拝借願います。
よろしくお願いいたします。

「データテーブルの結合」ではダメなのでしょうか?

1 Like

ForEachRowでループさせる際に「DataTable3」を構築しておいて、ループの中で
①「DataTable2」へ代入
②「DataTable2」と「DataTable3」をマージ

上記の認識でよろしいでしょうか?

この認識の場合、代入する際に上書きではなく追加する書き方などは無いということでしょうか?

そもそもLOOPがいらなくなると思っています。他に必要な処理が必要で、LOOPなんですと言われてはそれまでですけどね・・・

DataTable1と参照元データテーブルをInnerで結合すると、双方のキーが一致したもののみが、DataTable2 に出力されます。あとは不要な列を削除すれば。。。

1 Like

こんにちは

DataTableのJoinで良いと思いますが、列削除が面倒とか、LINQを使いたい等があれば以下のようにすれば良いかと思います。(メソッド構文ですが...。参照元データテーブルをDataTable0としています。)

DataTable2 = DataTable1.AsEnumerable.Where(function(r) DataTable0.AsEnumerable.Select(function(x) x("column0").toString).Contains(r("column0").toString)).CopyToDataTable

出力は
Column0
AA
CC
AA
AA

のようになりますので、必要に応じてソートください。

2 Likes

HANACCHIさん Yoichiさん
ご回答いただいたのに、返信が遅れ大変申し訳ございません。

Yoichiさんの命令文で質問の期待通りの回答を得ることができたのですが、
新たにデータテーブルのパターンにワイルドカードでの比較も必要になりました。

【参照元のデータテーブル】 ※「#」がワイルドカード
Column0
AA#
BBB
CC1
CC#

【フィルタをしたいデータテーブル】
Column0
AA1
BB2
BBB
CC
CCF
CC1
CCCCC
DDD
AAE
AA
BB

【フィルタ条件】
①3文字のみ対象
②ワイルドカードは先頭2桁で比較
③ワイルドカードと3文字固定はフィルタで重複させない
※重複除外が構文で難しい場合は、重複削除のアクティビティを直後に実行も考えています。

【期待する実行結果】
Column0
AA1
BBB
CCF
CC1
AAE

Yoichiさんの構文を参考に試してみたのですが、上手くいかないため
ご助力の程、よろしくお願いいたします。

こんにちは

条件が良く理解できていませんが、結果だけ見ると以下で良いように思えます。

DataTable2 = DataTable1.AsEnumerable.Where(function(r) (DataTable0.AsEnumerable.Select(function(x) x("column0").toString).Any(function(y) System.Text.RegularExpressions.Regex.IsMatch(r("column0").toString,"^"+y.Replace("#",".")+"$")))).CopyToDataTable
1 Like

LINQのJoinで使ってみてください
ループさせるデータはdtLoopで定義
DataTable2 = (From dtL In dtLoop.AsEnumerable Join dt1 In DataTable2.AsEnumerable On Convert.ToString(dtL(0)) Equals Convert.ToString(dt1(0)) Select dt1).CopyToDataTable()

※こいうエラー発生があれば
‘AsEnumerable’ は ‘System.Data.DataTable’ のメンバーではありません。
‘AsEnumerable’ は ‘System.Data.DataTable’ のメンバーではありません。

Main.xamlをNotepadで開いて
<AssemblyReference>System.Data.DataSetExtensions</AssemblyReference>
を追加してください

1 Like

Yoichiさん nguyendinhduc269さん

ご回答ありがとうございました。
期待する結果を得ることが出来ました。

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.