【问题标题】:Comparing two DataTables to determine if it is modified比较两个DataTable来判断是否被修改
【发布时间】:2015-07-10 05:58:28
【问题描述】:

我有两个数据表:

DataTable original; DataTable modified;

两张表行数相同,列数相同。

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

例如:

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

如果orginal 中的第1 行不等于modified 中的第1 行,则row1.SetModified()

如果orginal 中的第2 行不等于modified 中的第2 行@then row2.SetModified()....等

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

不应该是这样的:

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

如果orginal 中的第1 行不等于modified 中的第2 行,则row1.SetModified()

如果orginal 中的第2 行不等于modified 中的第3 行,则row1.SetModified()...等

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

明白了吗? :)

任何不使用Primary Keys的代码建议?

【问题讨论】:

    标签: c#


    【解决方案1】:

    在另一个 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>();
    

    【讨论】:

    • 这是一个很好的方法。编码少了很多
    • 好的..这是最直接的答案,非常感谢:)
    • 请务必对行数进行一些验证,如果为 0 行,则会引发 System.InvalidOperationException(源不包含 DataRows)。
    【解决方案2】:

    试试这个

    foreach (DataRow row1 in original.Rows)
        {
            foreach (DataRow row2 in modified.Rows)
            {
                var array1 = row1.ItemArray;
                var array2 = row2.ItemArray;
    
                if (array1.SequenceEqual(array2))
                {
                  // Your logic
                }
                else
                {
                  // Your logic
                }
            }
        }
    

    Reference

    【讨论】:

    • 谢谢,我会试试这个......如果它有效,我会在这里发表评论
    • 您的代码中的逻辑是这样的吗? if m_row[0] == o_row[0], m_row[1] == o_row[1], m_row[2] == o_row[2] 而不是这样? if m_row[0] == o_row[1], m_row[0] == o_row[2], m_row[0] == o_row[3]
    • 感谢它的工作!但我对逻辑做了一些更改:) 但无论如何谢谢!!
    • 我想我不能接受两个答案.. 你和@G-Man 同时回答了相同的正确答案...但是既有用又有帮助.. 我不知道哪个应该我接受
    【解决方案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());
         }
     }
    

    【讨论】:

    • 谢谢,我会试试这个...如果有效,我会在这里发表评论
    • 您的代码中的逻辑是这样的吗? if m_row[0] == o_row[0], m_row[1] == o_row[1], m_row[2] == o_row[2] 而不是这样? if m_row[0] == o_row[1], m_row[0] == o_row[2], m_row[0] == o_row[3]
    • 这个 array1.SequenceEqual(array2) 会做你的比较,如果你必须设置那个属性值
    • 很高兴为您提供帮助
    【解决方案4】:

    我认为遵循逻辑更好。

    static void CompareRows(DataTable original, DataTable modified)
    {
        foreach (DataRow row1 in modified.Rows)
        {
            bool isModified = true;
            var array1 = row1.ItemArray;
            foreach (DataRow row2 in original.Rows)
            {
                var array2 = row2.ItemArray;
    
                if (array1.SequenceEqual(array2))
                {
                    isModified = false;
                }
            }
            if (isModified)
                row1.SetModified();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 2011-01-31
      • 2019-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多