0

2 つの DataTables TableA と TableB を比較しようとしています。

例えば:

TableA には 7 列と 5 行があります。通貨列は主キーの TableB 5 列と 3 行です。通貨列が主キーです

通貨を使用して Table1A の各行データを TableB の行データと比較し、データが一致しない行のみを表示したい (Rate4 列まで) ここに画像の説明を入力

ご協力いただきありがとうございます

4

3 に答える 3

0

これを試して:

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 Xdecimal、最初の列Currencyはもちろんstringです。

于 2013-10-24T19:49:17.343 に答える
0

おそらくこのようなもの:

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"),
            ...
        };
于 2013-10-24T19:23:50.577 に答える