una son listas lista iguales elementos comparar c# datatable

c# - son - Comparar tablas de datos



comparar elementos de una lista c# (4)

He estado tratando de encontrar una forma de hacer la comparación de DataTable por un tiempo y terminé escribiendo mi propia función, esto es lo que obtuve:

bool tablesAreIdentical = true; // loop through first table foreach (DataRow row in firstTable.Rows) { foundIdenticalRow = false; // loop through tempTable to find an identical row foreach (DataRow tempRow in tempTable.Rows) { allFieldsAreIdentical = true; // compare fields, if any fields are different move on to next row in tempTable for (int i = 0; i < row.ItemArray.Length && allFieldsAreIdentical; i++) { if (!row[i].Equals(tempRow[i])) { allFieldsAreIdentical = false; } } // if an identical row is found, remove this row from tempTable // (in case of duplicated row exist in firstTable, so tempTable needs // to have the same number of duplicated rows to be considered equivalent) // and move on to next row in firstTable if (allFieldsAreIdentical) { tempTable.Rows.Remove(tempRow); foundIdenticalRow = true; break; } } // if no identical row is found for current row in firstTable, // the two tables are different if (!foundIdenticalRow) { tablesAreIdentical = false; break; } } return tablesAreIdentical;

Comparado con la solución de Dave Markle, el mío trata a dos mesas con los mismos registros pero en diferentes órdenes como idénticas. Espero que esto ayude a quien tropiece con este hilo de nuevo.

Creé una aplicación que muestra los registros de la base de datos en la ventana y comprueba la base de datos en busca de nuevos registros cada dos segundos. El problema es que la ventana parpadea cada vez que verifico nuevos registros y quiero arreglarlo. Intenté comparar la vieja tabla de datos con la nueva y actualizar solo si son diferentes. ¿Alguien sabe cuál es la mejor práctica para tales casos? Intenté hacerlo de la siguiente manera pero no funciona:

private bool GetBelongingMessages() { bool result = false; DataTable dtTemp = OleDbWorks.GetBelongingMessages(currentCallID); if(dtTemp != dtMessages) { dtMessages = dtTemp; result = true; } else { result = false; } return result; }


En primer lugar, es importante reconocer que lo que está comparando en su código son las referencias de las tablas de datos, no los contenidos de las tablas de datos. Para determinar si ambas tablas de datos tienen los mismos contenidos, tendrá que recorrer todas las filas y columnas para ver si son iguales:

//This assumes the datatables have the same schema... public bool DatatablesAreSame(DataTable t1, DataTable t2) { if (t1.Rows.Count != t2.Rows.Count) return false; foreach (DataColumn dc in t1.Columns) { for (int i = 0; i < t1.Rows.Count; i++) { if (t1.Rows[i][dc.ColumnName] != t2.Rows[i][dc.ColumnName]) { return false; } } } return true; }


public Boolean CompareDataTables(DataTable table1, DataTable table2) { bool flag = true; DataRow[] row3 = table2.Select(); int i = 0;// row3.Length; if (table1.Rows.Count == table2.Rows.Count) { foreach (DataRow row1 in table1.Rows) { if (!row1.ItemArray.SequenceEqual(row3[i].ItemArray)) { flag = false; break; } i++; } } else { flag = false; } return flag; }

// aquí esta función dará boolean como resultado return true si ambos son los mismos else devuelven falso si ambos no son iguales


Debe lanzar los objetos t1.Rows [i] [dc.ColumnName] y t1.Rows [i] [dc.ColumnName] de lo contrario, la instrucción t1.Rows [i] [dc.ColumnName]! = T2.Rows [i] [dc.ColumnName] siempre es verdadero. Modifiqué el código de la siguiente manera:

for(int i = 0; i < t1.Rows.Count; i++) { if((string)t1.Rows[i][1] != (string)t2.Rows[i][1]) return false; }

y funciona, pero no es una solución elegante.