DataTable oldTable, newTable; // Put there your tables
Dictionary<int, DataRow> deletedRows, newRows = new Dictionary<int, DataRow>(); // Here will be the result (key — row's Master_ID, value — the row)
var updatedRows = new Dictionary<int, Tuple<DataRow, DataRow>>(); // Here will be the result (key — row's Master_ID, value — tuple (first item — old row version, second item — new row version))
var commonIds = new List<int>();
foreach (var row in newTable.Rows) {
var id = row["Master_ID"];
if (oldTable.Contains(id)) {
commonIds.Add((int)id);
var rowInOldTable = oldTable.Rows.Find(id);
foreach (var column in oldTable.Columns) {
if (row[column] != rowInOldTable[column]) {
updatedRows.Add((int)id, Tuple.Create<DataRow, DataRow>(rowInOldTable, row));
break;
}
}
} else {
newRows.Add((int)id, row);
}
}
deletedRows = (from row in oldTable.Rows
where !commonIds.Contains((int)row["Master_ID"]))
.ToDictionary<DataRow, int>(row => (int)row["Master_ID"]);
2条答案
按热度按时间zwghvu4y1#
最有效的方法之一可能是使用类似字典的集合来确定行标识符是否是新的,我会使用
ILookup<TKey, TValue>
:hmmo2u0o2#
这段代码可能会对你有所帮助。它获取新
DataTable
中的每一行,并在旧DataTable
中查找它(以获取创建和更新的行),然后获取旧表中所有在新表中找不到的行(以获取删除的行)。如果你的表包含超过100K行,它会运行得非常慢,所以你最好把它放在一个单独的线程中。如果
Master_ID
列相同,我的代码会将两个不同的行视为一个更新行。