比较两个 DataTables 并用 Table2 减去 Table1

Compare two DataTables and subtract Table1 with Table2

C#

中的代码

我有两个 System.Data.DataTable 想要相互比较和相减。

我想用 Table2 减去 Table1 并完全删除 dataTableResult[=52= 中的重复行].

示例:

dataTable1
名称 数量
项目 1 200
项目 2 200
项目 3 200
项目 4 200

dataTable2
名称 数量
项目 1 200
项目 2 50
项目 3 200

dataTableResult
名称 数量
项目 2 150
项目 4 200

此致,

我举了一个似乎有效的例子。它基于具有 3 个数据网格视图的表单的 winform 应用程序,每个视图都有一个数据表 1,2 和结果作为它们的数据源。

有一个小的class来保存物品的细节

    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;
}

最终结果如您所愿。

希望这能帮助您指明正确的方向。 谢谢