比较两个DataTable以确定它是否被修改

时间:2015-07-10 05:58:28

标签: c#

我有两个DataTables:

DataTable original; DataTable modified;

这两个表的行数相同,列和数据相同。

我希望我的modified datable确定要与original数据表进行比较的每一行。如果modified数据表中的行不等于original数据表的行,则行.RowState将从{{1}设置为.SetModified()数据表。

例如:

............................................... ....

如果modified中的row1不等于orginal中的row1,那么modified

如果row1.SetModified()中的row2不等于orginal modified ....等中的row2

............................................... .............

它应该不是这样的:

............................................... .............

如果then row2.SetModified()中的row1不等于orginal中的row2,那么modified

如果row1.SetModified()中的row2不等于orginal中的row3,那么modified ......等等

............................................... .............

明白了吗? :)

不使用row1.SetModified()的任何代码建议?

4 个答案:

答案 0 :(得分:4)

在另一个foreach中使用foreach循环是N X N比较,你不需要这样做。

将第一行与其他表的第一行进行比较,将第二行与第二行进行比较,依此类推,使用Zip扩展方法对于这种情况非常有用。

DataTable original;
DataTable modified;

// your stuff

modified = modified.AsEnumerable().Zip<DataRow, DataRow, DataRow>(original.AsEnumerable(), (DataRow modif, DataRow orig) =>
{
    if (!orig.ItemArray.SequenceEqual<object>(modif.ItemArray))
    {
        modif.SetModified();
    }
    return modif;
}).CopyToDataTable<DataRow>();

答案 1 :(得分:3)

看看这段代码。您可以使用它来查看它是否符合您的需求:

class Program
{
    static void CompareRows(DataTable table1, DataTable table2)
    {
        foreach (DataRow row1 in table1.Rows)
        {
            foreach (DataRow row2 in table2.Rows)
            {
                var array1 = row1.ItemArray;
                var array2 = row2.ItemArray;

                if (array1.SequenceEqual(array2))
                {
                    Console.WriteLine("Equal: {0} {1}",
                    row1["Drug"], row2["Drug"]);
                }
                else
                {
                    Console.WriteLine("Not equal: {0} {1}",
                    row1["Drug"], row2["Drug"]);
                }
            }
        }
    }

    static DataTable GetTable1()
    {
        DataTable table = new DataTable();
        table.Columns.Add("Dosage", typeof(int));
        table.Columns.Add("Drug", typeof(string));
        table.Columns.Add("Patient", typeof(string));

        table.Rows.Add(25, "Indocin", "David");
        table.Rows.Add(50, "Enebrel", "Cecil");
        return table;
     }

     static DataTable GetTable2()
     {
         DataTable table = new DataTable();
         table.Columns.Add("Dosage", typeof(int));
         table.Columns.Add("Drug", typeof(string));
         table.Columns.Add("Patient", typeof(string));

         table.Rows.Add(21, "Combivent", "Janet");
         table.Rows.Add(50, "Enebrel", "Cecil");
         table.Rows.Add(10, "Hydralazine", "Christoff");
         return table;
     }

     static void Main()
     {
         CompareRows(GetTable1(), GetTable2());
     }
 }

答案 2 :(得分:3)

试试这个

this.cfg.highlighter={show: true,tooltipAxes: 'y',useAxesFormatters: false,tooltipFormatString: "%'d"};

Reference

答案 3 :(得分:1)

我认为遵循逻辑更好。

var