簡體   English   中英

比較 c# 中的兩個數據表

[英]compare two datatable in c#

比較兩個數據表的最佳方法是什么。 我填充兩個數據表,讀取兩個不同的 xml,現在我需要比較並返回數據表方面的差異。我的比較邏輯是

private DataTable CompareDataTables(DataTable dtFirst, DataTable dtSecond)
    {
        int result = 0;
        bool flag = false;
        DataTable dtNoRows = new DataTable();
        dtNoRows.Columns.Add("Result");

        DataTable dtDiff = new DataTable();
        dtDiff.Columns.Add("Field Name");
        dtDiff.Columns.Add("Old Value");
        dtDiff.Columns.Add("New Value");
        DataRow dr = null;
        if (dtFirst.Columns.Count == dtSecond.Columns.Count)
        {
            for (int i = 0; i <= dtFirst.Columns.Count - 1; i++)
            {
                try
                {
                    DateTime.Parse(dtFirst.Rows[0][dtFirst.Columns[i].ColumnName.ToString()].ToString().Trim());
                    flag = true;
                }
                catch (Exception ex)
                {
                    flag = false;
                }

                if (!flag)
                {
                    if (dtFirst.Rows[0][dtFirst.Columns[i].ColumnName.ToString()].ToString().Trim().ToUpper() != dtSecond.Rows[0][dtSecond.Columns[i].ColumnName.ToString()].ToString().Trim().ToUpper())
                    {
                        dr = dtDiff.NewRow();
                        dr["Field Name"] = dtFirst.Columns[i].ColumnName.ToString();
                        dr["Old Value"] = dtFirst.Rows[0][dtFirst.Columns[i].ColumnName.ToString()].ToString().Trim();
                        dr["New Value"] = dtSecond.Rows[0][dtSecond.Columns[i].ColumnName.ToString()].ToString().Trim();
                        dtDiff.Rows.Add(dr);
                    }
                }
                else
                {
                    result = DateTime.Compare(DateTime.Parse(dtFirst.Rows[0][dtFirst.Columns[i].ColumnName.ToString()].ToString()), DateTime.Parse(dtSecond.Rows[0][dtSecond.Columns[i].ColumnName.ToString()].ToString()));
                    if (result != 0)
                    {
                        dr = dtDiff.NewRow();
                        dr["Field Name"] = dtFirst.Columns[i].ColumnName.ToString();
                        dr["Old Value"] = DateTime.Parse(dtFirst.Rows[0][dtFirst.Columns[i].ColumnName.ToString()].ToString().Trim()).ToString("MM/dd/yyyy") + " - " + DateTime.Parse(dtFirst.Rows[0][dtFirst.Columns[i].ColumnName.ToString()].ToString().Trim()).ToString("hh:mm:ss");
                        dr["New Value"] = DateTime.Parse(dtSecond.Rows[0][dtSecond.Columns[i].ColumnName.ToString()].ToString().Trim()).ToString("MM/dd/yyyy") + " - " + DateTime.Parse(dtSecond.Rows[0][dtSecond.Columns[i].ColumnName.ToString()].ToString().Trim()).ToString("hh:mm:ss");
                        dtDiff.Rows.Add(dr);

                    }
                    flag = false;
                }
            }
        }
        return dtDiff;
    }

我的代碼工作正常,但我需要有什么最好的出路。 請指導我。

var qry1 = dtDuplicate.AsEnumerable().Select(a => new { SchoolID = a["SchoolMID"].ToString()});
var qry2 = dsValadateSchoolInfo.Tables[1].AsEnumerable().Select(b => new { SchoolID = ["SchoolMID"].ToString() });

var exceptAB = qry1.Except(qry2);

DataTable dtMisMatch = (from a in dtDuplicate.AsEnumerable()
                        join ab in exceptAB on a["SchoolMID"].ToString() equals ab.SchoolID
                        select a).CopyToDataTable();

您可以使用 LINQ 來比較表值(兩個表必須具有相同的結構)

bool flag = false;
if (dtFirst.Columns.Count == dtSecond.Columns.Count)
{
    for (int i = 0; i <= dtFirst.Columns.Count - 1; i++)
    {
        String colName = dtFirst.Columns[i].ColumnName;
        var colDataType = dtFirst.Columns[i].DataType.GetType();
        var colValue = dtFirst.Columns[i];
        flag = dtSecond.AsEnumerable().Any(T => typeof(T).GetProperty(colName).GetValue(T, typeof(colDataType)) == colValue);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM