代码C#
我有两个System.Data.DataTable
,我想相互比较和减去。
我想用表2减去表1,并从dataTableResult中完全删除重复的行。
例:
数据表1名称 数量 项目
1
200
项目2 200 项目3 200 项目4 200
数据表2名称 数量 项目
1 200
项目2
50 项目3 200
数据表结果
名称 数量 项目
2 150 项目4 200
问候,
我举了一个似乎有效的例子。它基于一个具有 3 个数据网格视图的表单的 winform 应用程序,每个视图都有一个数据表 1,2 和 Result 作为其数据源。
有一个小类来保存项目的细节
public class Item
{
public string Name { get; set; }
public int Quantity { get; set; }
}
private void button2_Click(object sender, EventArgs e)
{
DataTable dt1 = new DataTable("dataTable1");
dt1.Columns.Add("Name", typeof(string));
dt1.Columns.Add("Quantity", typeof(int));
DataRow r = dt1.NewRow();
r["Name"] = "Item1";
r["Quantity"] = 200;
dt1.Rows.Add(r);
r = dt1.NewRow();
r["Name"] = "Item2";
r["Quantity"] = 200;
dt1.Rows.Add(r);
r = dt1.NewRow();
r["Name"] = "Item3";
r["Quantity"] = 200;
dt1.Rows.Add(r);
r = dt1.NewRow();
r["Name"] = "Item4";
r["Quantity"] = 200;
dt1.Rows.Add(r);
dgGridView.DataSource = dt1;
DataTable dt2 = new DataTable("dataTable1");
dt2.Columns.Add("Name", typeof(string));
dt2.Columns.Add("Quantity", typeof(int));
DataRow r2 = dt2.NewRow();
r2["Name"] = "Item1";
r2["Quantity"] = 200;
dt2.Rows.Add(r2);
r2 = dt2.NewRow();
r2["Name"] = "Item2";
r2["Quantity"] = 50;
dt2.Rows.Add(r2);
r2 = dt2.NewRow();
r2["Name"] = "Item3";
r2["Quantity"] = 200;
dt2.Rows.Add(r2);
dataGridView1.DataSource = dt2;
DataTable dtResult = new DataTable("dataTable1");
dtResult.Columns.Add("Name", typeof(string));
dtResult.Columns.Add("Quantity", typeof(int));
List<Item> dt1Items = dt1.AsEnumerable().Select(row => new Item()
{
Name=row["Name"].ToString(),
Quantity =Convert.ToInt32(row["Quantity"])
}).ToList();
List<Item> dt2Items = dt2.AsEnumerable().Select(row => new Item()
{
Name = row["Name"].ToString(),
Quantity = Convert.ToInt32(row["Quantity"])
}).ToList();
foreach (Item item in dt1Items)
{
var matched = dt2Items.FirstOrDefault(f => f.Name == item.Name);
var rr = dtResult.NewRow();
if (matched == null) //Item does not exist in dataTable2 so add to dataTableResult
{
rr["Name"] = item.Name;
rr["Quantity"] = item.Quantity;
dtResult.Rows.Add(rr);
continue;
}
//Item does exist but the subtraction == 0 do not add.
if (item.Quantity - matched.Quantity == 0)
continue;
//Else add diff to results
rr["Name"] = item.Name;
rr["Quantity"] = item.Quantity - matched.Quantity;
dtResult.Rows.Add(rr);
}
dataGridView2.DataSource = dtResult;
}
最终结果符合您的预期结果。
希望这有助于为您指明正确的方向。 谢谢