按特定标识符比较两个 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 解决这个问题,我会很高兴。
【问题讨论】:
声明其中一个表的主键,然后枚举另一个,Find
ing在第一个表中通过第二个表行的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 按日期范围过滤表格