比较两个DataTable中不同的记录,且合并两个DataTable的列显示,有图

    protected void Page_Load(object sender, EventArgs e)
    {
        creatDataTable();        
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        DataTable DataTableA = ViewState["datatable1"] as DataTable;
        DataTable DataTableB = ViewState["datatable2"] as DataTable;
        DataTableB.Columns.Add("flag", typeof(String));
        DataTableB.Columns["flag"].DefaultValue = "×";
        DataView dv1 = DataTableA.DefaultView;
        DataView dv2 = DataTableB.DefaultView;
        foreach (DataRowView drv1 in dv1)
        {
            dv2.RowFilter = " id = '" + drv1["id"].ToString() + "'";
            if (dv2.Count > 0)
            {
                if (CompareUpdate(drv1, dv2[0]))//比较是否相同
                {
                    dv2[0].Row["flag"] = "√";
                }
                else
                {
                    dv2[0].Row["flag"] = "×";
                }
            }
        }
        GridView3.DataSource = MergeDataTable(DataTableA,DataTableB);
        GridView3.DataBind();
    }

    #region 创建测试DataTable
    protected void creatDataTable()
    {
        //第一步 先初始化数据 
        DataTable dtA = new DataTable();
        dtA.Columns.Add("id", typeof(int));
        dtA.Columns.Add("name", typeof(string));
        dtA.Rows.Add(1, "a");
        dtA.Rows.Add(2, "b");
        dtA.Rows.Add(3, "c");
        dtA.Rows.Add(4, "d");

        DataTable dtB = dtA.Clone();
        dtB.Rows.Add(1, "a");
        dtB.Rows.Add(2, "d");
        dtB.Rows.Add(3, "e");
        dtB.Rows.Add(4, "f");

        GridView1.DataSource = dtA;
        GridView1.DataBind();

        GridView2.DataSource = dtB;
        GridView2.DataBind();

        ViewState["datatable1"] = dtA;
        ViewState["datatable2"] = dtB;
    }
    #endregion 

    #region 比较数据行是否相同
    /// <summary>
    /// 比较数据行是否相同
    /// </summary>
    /// <param name="dr1"></param>
    /// <param name="dr2"></param>
    /// <returns></returns>
    private static bool CompareUpdate(DataRowView dr1, DataRowView dr2)
    {
        //行里只要有一项不一样,整个行就不一样,无需比较其它
        object val1;
        object val2;
        for (int i = 1; i < dr1.Row.ItemArray.Length; i++)
        {
            val1 = dr1[i];
            val2 = dr2[i];
            if (!val1.Equals(val2))
            {
                return false;
            }
        }
        return true;
    }
    #endregion 

    #region 合并两个DataTable列
    /// <summary>
    /// 合并两个DataTable列
    /// </summary>
    /// <param name="dt1"></param>
    /// <param name="dt2"></param>
    /// <returns></returns>
    public static DataTable MergeDataTable(DataTable dt1, DataTable dt2)
    {
        //定义dt的行数 
        int dtRowCount = 0;
        //dt的行数为dt1或dt2中行数最大的行数 
        if (dt1.Rows.Count > dt2.Rows.Count)
        {
            dtRowCount = dt1.Rows.Count;
        }
        else
        {
            dtRowCount = dt2.Rows.Count;
        }
        DataTable dt = new DataTable();
        //向dt中添加dt1的列名 
        for (int i = 0; i < dt1.Columns.Count; i++)
        {
            dt.Columns.Add(dt1.Columns[i].ColumnName + "1");
        }
        //向dt中添加dt2的列名 
        for (int i = 0; i < dt2.Columns.Count; i++)
        {
            dt.Columns.Add(dt2.Columns[i].ColumnName + "2");
        }
        for (int i = 0; i < dtRowCount; i++)
        {
            DataRow row = dt.NewRow();
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                for (int k = 0; k < dt1.Columns.Count; k++) { if ((dt1.Rows.Count - 1) >= i) { row[k] = dt1.Rows[i].ItemArray[k]; } }
                for (int k = 0; k < dt2.Columns.Count; k++) { if ((dt2.Rows.Count - 1) >= i) { row[dt1.Columns.Count + k] = dt2.Rows[i].ItemArray[k]; } }
            }
            dt.Rows.Add(row);
        }
        return dt;
    }
    #endregion 

比较两个 DataTable差异,可以使用 LINQ 查询和 `Except()` 方法来实现。 假设我们要比较两个 DataTable 表 `table1` 和 `table2` 的某一 `columnName` 的差异,可以按照以下步骤进行: 1. 使用 `AsEnumerable()` 方法将 DataTable 转换为 `IEnumerable<DataRow>`,以便在 LINQ 查询使用。 2. 使用 `Select()` 方法选择需要比较。 3. 使用 `Except()` 方法获取两个不同的行。 下面是示例代码: ```csharp // 获取 table1 和 table2 不同的行 var diff = table1.AsEnumerable() .Select(row => row.Field<string>(columnName)) .Except(table2.AsEnumerable() .Select(row => row.Field<string>(columnName))); // 输出差异 foreach (var val in diff) { Console.WriteLine(val); } ``` 上面的代码首先使用 `Select()` 方法选择了 `columnName` ,并使用 `AsEnumerable()` 方法将 DataTable 转换为 `IEnumerable<DataRow>`。然后使用 `Except()` 方法获取两个不同的行,最后输出差异。 需要注意的是,如果两个包含相同的值但顺序不同,那么这些值将被视为不同,因此你可能需要使用 `OrderBy()` 方法来排序。例如: ```csharp // 获取 table1 和 table2 不同的行 var diff = table1.AsEnumerable() .Select(row => row.Field<string>(columnName)) .OrderBy(val => val) .Except(table2.AsEnumerable() .Select(row => row.Field<string>(columnName)) .OrderBy(val => val)); // 输出差异 foreach (var val in diff) { Console.WriteLine(val); } ``` 这里使用 `OrderBy()` 方法对两个表的选择结果进行排序,以便获取准确的差异
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smartsmile2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值