2015-07-10 67 views
2

我有两个数据表:比较两个数据表,以确定它是否被修改

DataTable original; DataTable modified;

两个表具有相同的行数及其列和DATAS是一样的。

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

例如:

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

如果ROW1中orginal不等于在modified然后row1.SetModified()

如果在orginal ROW2不等于在modifiedthen row2.SetModified()到ROW2 ....等至ROW1

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

它不应该是这样的:

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

如果ROW1中orginal不等于在modified到ROW2然后row1.SetModified()

如果orginal ROW2不等于第3行modified然后row1.SetModified() ...等

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

想到了吗? :)

任何代码建议不使用Primary Keys

回答

3

在另一个foreach中使用foreach循环是N×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

这是一个很好的做法。这么多少编码 – Gericke

+0

行..这是最直接的点答案,非常感谢你:) –

+1

只是一定要做一些验证行计数,在0行的情况下,一个System.InvalidOperationException(源包含没有DataRows)被引发。 –

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()); 
    } 
} 
+0

谢谢我会试试这个...我会在这里评论如果它工作 –

+0

是你的代码是这样的逻辑吗? '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]' –

+0

这个array1.SequenceEqual(array2)会做你的比较,里面的,如果你必须设置该属性值 – Gericke

3

试试这个

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

+0

谢谢我会试试这个...我会在这里评论它是否工作 –

+0

是你的代码的逻辑吗? '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]' –

+0

谢谢!但我做了一些逻辑变化:) 但无论如何谢谢! –

1

我觉得下面的逻辑是更好的。

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