Как сравнить 2 таблицы данных

У меня есть 2 datatables, и я просто хочу знать, являются ли они одинаковыми или нет. Под «тем же», я имею в виду, что у них точно такое же количество строк с точно такими же данными в каждом столбце, или нет. Мне бы хотелось написать (найти) метод, который принимает обе таблицы и возвращает логическое значение.

Как я могу сравнить 2 datatables таким образом? Оба имеют одинаковые схемы.

Вам нужно будет прокручивать строки каждой таблицы, а затем через каждый столбец внутри этого цикла для сравнения отдельных значений.

Здесь есть пример кода: http://canlu.blogspot.com/2009/05/how-to-compare-two-datatables-in-adonet.html

public static bool AreTablesTheSame( DataTable tbl1, DataTable tbl2) { if (tbl1.Rows.Count != tbl2.Rows.Count || tbl1.Columns.Count != tbl2.Columns.Count) return false; for ( int i = 0; i < tbl1.Rows.Count; i++) { for ( int c = 0; c < tbl1.Columns.Count; c++) { if (!Equals(tbl1.Rows[i][c] ,tbl2.Rows[i][c])) return false; } } return true; } 

Если вы возвращаете DataTable как функцию, вы можете:

 DataTable dataTable1; // Load with data DataTable dataTable2; // Load with data (same schema) var differences = dataTable1.AsEnumerable().Except(dataTable2.AsEnumerable(), DataRowComparer.Default); return differences.Any() ? differences.CopyToDataTable() : new DataTable(); За DataTable dataTable1; // Load with data DataTable dataTable2; // Load with data (same schema) var differences = dataTable1.AsEnumerable().Except(dataTable2.AsEnumerable(), DataRowComparer.Default); return differences.Any() ? differences.CopyToDataTable() : new DataTable(); 

OP, MAW74656 , первоначально отправил этот ответ в орган вопроса в ответ на принятый ответ , как объяснено в этом комментарии :

Я использовал это и написал публичный метод для вызова кода и возврата логического.

Ответ OP:

Используемый код:

 public bool tablesAreTheSame(DataTable table1, DataTable table2) { DataTable dt; dt = getDifferentRecords(table1, table2); if (dt.Rows.Count == 0) return true; else return false; } //Found at http://canlu.blogspot.com/2009/05/how-to-compare-two-datatables-in-adonet.html private DataTable getDifferentRecords(DataTable FirstDataTable, DataTable SecondDataTable) { //Create Empty Table DataTable ResultDataTable = new DataTable("ResultDataTable"); //use a Dataset to make use of a DataRelation object using (DataSet ds = new DataSet()) { //Add tables ds.Tables.AddRange(new DataTable[] { FirstDataTable.Copy(), SecondDataTable.Copy() }); //Get Columns for DataRelation DataColumn[] firstColumns = new DataColumn[ds.Tables[0].Columns.Count]; for (int i = 0; i < firstColumns.Length; i++) { firstColumns[i] = ds.Tables[0].Columns[i]; } DataColumn[] secondColumns = new DataColumn[ds.Tables[1].Columns.Count]; for (int i = 0; i < secondColumns.Length; i++) { secondColumns[i] = ds.Tables[1].Columns[i]; } //Create DataRelation DataRelation r1 = new DataRelation(string.Empty, firstColumns, secondColumns, false); ds.Relations.Add(r1); DataRelation r2 = new DataRelation(string.Empty, secondColumns, firstColumns, false); ds.Relations.Add(r2); //Create columns for return table for (int i = 0; i < FirstDataTable.Columns.Count; i++) { ResultDataTable.Columns.Add(FirstDataTable.Columns[i].ColumnName, FirstDataTable.Columns[i].DataType); } //If FirstDataTable Row not in SecondDataTable, Add to ResultDataTable. ResultDataTable.BeginLoadData(); foreach (DataRow parentrow in ds.Tables[0].Rows) { DataRow[] childrows = parentrow.GetChildRows(r1); if (childrows == null || childrows.Length == 0) ResultDataTable.LoadDataRow(parentrow.ItemArray, true); } //If SecondDataTable Row not in FirstDataTable, Add to ResultDataTable. foreach (DataRow parentrow in ds.Tables[1].Rows) { DataRow[] childrows = parentrow.GetChildRows(r2); if (childrows == null || childrows.Length == 0) ResultDataTable.LoadDataRow(parentrow.ItemArray, true); } ResultDataTable.EndLoadData(); } return ResultDataTable; } 

Попробуйте использовать linq для набора данных

 (from b in table1.AsEnumerable() select new { id = b.Field("id")}).Except( from a in table2.AsEnumerable() select new {id = a.Field("id")}) 

Проверьте эту статью: Сравнение DataSets с использованием LINQ

Я получил решение для того, как сравнить 2 dataTables

http://microsoftdotnetsolutions.blogspot.in/2012/12/compare-two-datatables.html

Если у вас есть таблицы в базе данных, вы можете сделать полное внешнее соединение, чтобы получить различия. Пример:

 select t1.Field1, t1.Field2, t2.Field1, t2.Field2 from Table1 t1 full outer join Table2 t2 on t1.Field1 = t2.Field1 and t1.Field2 = t2.Field2 where t1.Field1 is null or t2.Field2 is null 

Все идентичные записи отфильтровываются. Есть данные либо в первых двух, либо в двух последних полях, в зависимости от того, из какой таблицы происходит запись.

  ///  /// https://stackoverflow.com/a/45620698/2390270 /// Compare a source and target datatables and return the row that are the same, different, added, and removed ///  /// DataTable to compare /// DataTable to compare to dtOld /// DataTable that would give you the common rows in both /// DataTable that would give you the difference /// DataTable that would give you the rows added going from dtOld to dtNew /// DataTable that would give you the rows removed going from dtOld to dtNew public static void GetTableDiff(DataTable dtOld, DataTable dtNew, ref DataTable dtSame, ref DataTable dtDifferences, ref DataTable dtAdded, ref DataTable dtRemoved) { try { dtAdded = dtOld.Clone(); dtAdded.Clear(); dtRemoved = dtOld.Clone(); dtRemoved.Clear(); dtSame = dtOld.Clone(); dtSame.Clear(); if (dtNew.Rows.Count > 0) dtDifferences.Merge(dtNew.AsEnumerable().Except(dtOld.AsEnumerable(), DataRowComparer.Default).CopyToDataTable()); if (dtOld.Rows.Count > 0) dtDifferences.Merge(dtOld.AsEnumerable().Except(dtNew.AsEnumerable(), DataRowComparer.Default).CopyToDataTable()); if (dtOld.Rows.Count > 0 && dtNew.Rows.Count > 0) dtSame = dtOld.AsEnumerable().Intersect(dtNew.AsEnumerable(), DataRowComparer.Default).CopyToDataTable(); foreach (DataRow row in dtDifferences.Rows) { if (dtOld.AsEnumerable().Any(r => Enumerable.SequenceEqual(r.ItemArray, row.ItemArray)) && !dtNew.AsEnumerable().Any(r => Enumerable.SequenceEqual(r.ItemArray, row.ItemArray))) { dtRemoved.Rows.Add(row.ItemArray); } else if (dtNew.AsEnumerable().Any(r => Enumerable.SequenceEqual(r.ItemArray, row.ItemArray)) && !dtOld.AsEnumerable().Any(r => Enumerable.SequenceEqual(r.ItemArray, row.ItemArray))) { dtAdded.Rows.Add(row.ItemArray); } } } catch (Exception ex) { Debug.WriteLine(ex.ToString()); } } 

Нет ничего, что сделает это для вас; единственный способ, которым вы собираетесь это сделать, – перебрать все строки / столбцы и сравнить их друг с другом.

Хорошо, если вы вообще используете DataTable, вместо сравнения двух «DataTables» вы можете просто сравнить DataTable, который будет иметь изменения с исходными данными, когда он был загружен. AKA DataTable.GetChanges Method (DataRowState)

или это, я не реализовал сравнение массивов, поэтому у вас также будет некоторое удовольствие 🙂

 public bool CompareTables(DataTable a, DataTable b) { if(a.Rows.Count != b.Rows.Count) { // different size means different tables return false; } for(int rowIndex=0; rowIndex 
Interesting Posts
Давайте будем гением компьютера.