2013-10-24 56 views
0

我想比較兩個DataTables TableA和TableB。如何比較兩個數據表,並返回只有不匹配數據的記錄

例如:

表A有7列5行。貨幣列是主鍵 TableB 5列和3行。貨幣列是主鍵

我想用貨幣來比較Table1A對陣表B中的行數據中的每一行的數據,僅顯示未匹配數據的行(U PTO列Rate4) enter image description here

謝謝您幫助

+1

你到目前爲止嘗試過什麼? –

+0

@Siva,我試圖通過TableA循環並獲取貨幣代碼。使用貨幣,從表B中取回相應的記錄並比較數據。這工作,但代碼看起來很糟糕。我的意思是在真正的表格中,總數列接近於20 – Ullan

+0

發表您的代碼片段 –

回答

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"), 
      ... 
     }; 
+0

感謝Magnus,我會測試您的解決方案並儘快發佈結果。 – Ullan

+0

這就像一個魅力 – Ullan

1
var tableA = new DataTable(); 
tableA.Columns.Add("Currency", typeof(string)); 
tableA.Columns.Add("Rate1", typeof(decimal)); 
tableA.Columns.Add("Rate2", typeof(decimal)); 
tableA.Columns.Add("Rate3", typeof(decimal)); 
tableA.Columns.Add("Rate4", typeof(decimal)); 
tableA.Columns.Add("Rate5", typeof(decimal)); 
tableA.Columns.Add("Rate6", typeof(decimal)); 

tableA.Rows.Add("USD", 1m, 2m, 3m, 4m, 5.5m, 4.5m); 
tableA.Rows.Add("JPY", 1.11m, 4.1m, 3.3m, 4.6m, 5.5m, 3.3m); 
tableA.Rows.Add("GBP", 3.0m, 1m, 3m, 4m, 7.7m, 8.8m); 
tableA.Rows.Add("EUR", 3.0m, 1m, 3m, 4m, 7.7m, 8.8m); 
tableA.Rows.Add("MXN", 3.0m, 1m, 3m, 4m, 7.7m, 8.8m); 


var tableB = new DataTable(); 
tableB.Columns.Add("Currency", typeof(string)); 
tableB.Columns.Add("Rate1", typeof(decimal)); 
tableB.Columns.Add("Rate2", typeof(decimal)); 
tableB.Columns.Add("Rate3", typeof(decimal)); 
tableB.Columns.Add("Rate4", typeof(decimal)); 

tableB.Rows.Add("USD", 1m, 2m, 3m, 4m); 
tableB.Rows.Add("JPY", 1.11m, 9.9m, 3.3m, 4.6m); 
tableB.Rows.Add("GBP", 3m, 1m, 3m, 4m); 

var query = from r1 in tableA.AsEnumerable() 
      from r2 in tableB.AsEnumerable() 
      where 
       r1.Field<string>("Currency") == r2.Field<string>("Currency") 

      && r1.Field<decimal>("Rate1") == r2.Field<decimal>("Rate1") 
      && r1.Field<decimal>("Rate2") == r2.Field<decimal>("Rate2") 
      && r1.Field<decimal>("Rate3") == r2.Field<decimal>("Rate3") 
      && r1.Field<decimal>("Rate4") == r2.Field<decimal>("Rate4") 
    select r2; 

var result = tableB.AsEnumerable().Except(query).ToList(); 
+0

很好的例子ELIE。 –

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的數據類型。

相關問題