Cómo comparar 2 dataTables

Tengo 2 tablas de datos y solo quiero saber si son iguales o no. Por “lo mismo”, quiero decir, ¿tienen exactamente el mismo número de filas con exactamente los mismos datos en cada columna, o no? Me encantaría escribir (encontrar) un método que acepte ambas tablas y devuelva un booleano.

¿Cómo puedo comparar 2 tablas de datos de esta manera? Ambos tienen esquemas idénticos.

Debería recorrer las filas de cada tabla y luego recorrer cada columna dentro de ese ciclo para comparar valores individuales.

Aquí hay un ejemplo de código: 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; } 

Si devolviera una DataTable como una función, podría:

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

El OP, MAW74656 , originalmente publicó esta respuesta en el cuerpo de la pregunta en respuesta a la respuesta aceptada , como se explica en este comentario :

Usé esto y escribí un método público para llamar al código y devolver el booleano.

La respuesta del OP:

Código utilizado:

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

Intenta hacer uso de linq para Dataset

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

Consulte este artículo: Comparación de DataSets utilizando LINQ

Tengo la solución para Cómo comparar 2 dataTables es

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

Si tiene las tablas en una base de datos, puede hacer una combinación externa completa para obtener las diferencias. Ejemplo:

 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 

Todos los registros que son idénticos se filtran. Hay datos en los dos primeros o en los dos últimos campos, según la tabla de la que provenga el registro.

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

No hay nada por ahí que vaya a hacer esto por usted; la única forma de lograr esto es iterar todas las filas / columnas y compararlas entre sí.

Bueno, si está usando una DataTable en todo momento, en lugar de comparar dos ‘DataTables’ podría comparar la DataTable que va a tener cambios con los datos originales cuando se cargó AKA DataTable.GetChanges Method (DataRowState)

o esto, no implementé la comparación de matriz así que también te divertirás 🙂

 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