我想比較兩個DataTables TableA和TableB。如何比較兩個數據表,並返回只有不匹配數據的記錄
例如:
表A有7列5行。貨幣列是主鍵 TableB 5列和3行。貨幣列是主鍵
我想用貨幣來比較Table1A對陣表B中的行數據中的每一行的數據,僅顯示未匹配數據的行(U PTO列Rate4)
謝謝您幫助
我想比較兩個DataTables TableA和TableB。如何比較兩個數據表,並返回只有不匹配數據的記錄
例如:
表A有7列5行。貨幣列是主鍵 TableB 5列和3行。貨幣列是主鍵
我想用貨幣來比較Table1A對陣表B中的行數據中的每一行的數據,僅顯示未匹配數據的行(U PTO列Rate4)
謝謝您幫助
像這樣的東西可能:
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"),
...
};
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();
很好的例子ELIE。 –
試試這個:
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
的數據類型。
你到目前爲止嘗試過什麼? –
@Siva,我試圖通過TableA循環並獲取貨幣代碼。使用貨幣,從表B中取回相應的記錄並比較數據。這工作,但代碼看起來很糟糕。我的意思是在真正的表格中,總數列接近於20 – Ullan
發表您的代碼片段 –