按特定标识符比较两个 DataTables 行并相应地标记它们

Posted

技术标签:

【中文标题】按特定标识符比较两个 DataTables 行并相应地标记它们【英文标题】:Compare two DataTables rows by specific identifier and marking them accordingly 【发布时间】:2022-01-13 09:27:21 【问题描述】:

我有两个完全相同的数据表(“旧”和“新”),我想比较具有相同标识符的行。

例如,两个数据表(dt1,dt2)都有“ID”列,所以我想比较 dt1 中“ID = 1”的行与 dt2 中的同一行(ID = 1),看看是否有任何单元格不同在该行的 dt2 中。

dt1 (Old)                   |        dt2 (New)
____                             ________
ID , Col1 , Col2            |   ID , Col1 , Col2 

1 ,"somedata","somedata2"   |  1 ,"somedata","somedata2"    -> Same
5 ,"somedata","somedata2"   |  5 ,"somedata","somedata2"    -> Same
90 ,"somedata","somedata2"  |  90 ,"changed","somedata2"   -> Changed
100 ,"somedata","somedata2" |  100 ,"somedata","changed"  -> Changed

所以我想编写一个函数,该函数将返回此示例中已更改 (90,100) 的 ID 列表。

不胜感激。

我正在使用 C# 进行编码,如果有人知道如何使用 Linq 解决这个问题,我会很高兴。

【问题讨论】:

声明其中一个表的主键,然后枚举另一个,Finding在第一个表中通过第二个表行的PK值,然后比较每一行的itemarray中的值 【参考方案1】:

编辑 我会使用的函数有点像这样:

public List<int> DatableCompare(DataTable oldDt, DataTable newDt)

    var changedIds = new List<int>();
    for(int i = 0; i < oldDt.Rows.Count; i++)
    
         if (!oldDt.Rows[i].ItemArray.SequenceEqual(newDt.Rows[i].ItemArray))
         
             changedIds.Add((int)oldDt.Rows[i][0]);
         
    
    return changedIds;

希望这有帮助!

这是假设您的 Datatable 的第一列是 int 类型,否则它会崩溃.. 也许某种 Convert.ToInt32() 会更安全

【讨论】:

是的,它看起来不错,但我还有很多列要比较。谢谢 @JmukhadzeT 我编辑了我的答案,我想到了一个比较整个元素数组的好方法

以上是关于按特定标识符比较两个 DataTables 行并相应地标记它们的主要内容,如果未能解决你的问题,请参考以下文章

按特定属性比较两个列表

DataTables PHP动态编辑/删除基于用户权限的链接

Angular-DataTables - 搜索特定的 html 类值

DataTables+Datepicker 按日期范围过滤表格

将 boundingRect() 映射到父项并相交会产生意外的碰撞处理结果

如何从选择中搜索/过滤特定的 DataTables 列