2 つの DataTables TableA と TableB を比較しようとしています。
例えば:
TableA には 7 列と 5 行があります。通貨列は主キーの TableB 5 列と 3 行です。通貨列が主キーです
通貨を使用して Table1A の各行データを TableB の行データと比較し、データが一致しない行のみを表示したい (Rate4 列まで)
ご協力いただきありがとうございます
これを試して:
DataTable dt = TableB.Clone();
dt = TableA.AsEnumerable().Join(TableB.AsEnumerable(),
row=>row.Field<string>(0),
row=>row.Field<string>(0), (a,b)=> new {a,b})
.Select(pair=> {
DataRow row = dt.NewRow();
row.SetField<string>(0, pair.a.Field<string>(0));
bool notNull = false;
for(int i = 1; i < 5; i++){
var a = pair.a.Field<decimal>(i);
var b = pair.b.Field<decimal>(i);
if(a == b) row.SetField<decimal>(i, 0);
else {
row.SetField<decimal>(i, Math.Max(a,b));
notNull = true;
}
}
return notNull ? row : null;
}).Where(row=>row != null).CopyToDataTable();
注: すべての列のデータ型は だと思いますRate X
がdecimal
、最初の列Currency
はもちろんstring
です。
おそらくこのようなもの:
var q = from a in dtA.AsEnumerable()
join b in dtB.AsEnumerable()
on a.Field<string>("Currency") equals b.Field<string>("Currency")
where a.Field<double>("Rate1") != b.Field<double>("Rate1") ||
a.Field<double>("Rate2") != b.Field<double>("Rate2") || ....
select new
{
Currency = a.Field<string>("Currency"),
Rate1 = a.Field<double>("Rate1") == b.Field<double>("Rate1") ?
0 : a.Field<double>("Rate1"),
Rate2 = a.Field<double>("Rate2") == b.Field<double>("Rate2") ?
0 : a.Field<double>("Rate2"),
...
};