TL;博士
您可以使用以下代码执行此操作,但请继续阅读以了解更多详细信息:
change = Planned_Table.AsEnumerable _
.Except(Actual_Table.AsEnumerable, DataRowComparer.Default) _
.CopyToDataTable
这里有几点需要注意:
正如在这个 SO question中指出的那样,DataTable.Merge
不会改变行状态,所以寻找行DataRowState.Added
总是空的。
此外,Merge
将第二个表中的每一行添加到第一个表中,因此即使 RowState已更改,第二个表中的所有内容也会出现。
最后,假设我们只将第二个数据表中的唯一值添加到第一个数据表中,我们只会取回第二组中的元素,而不是第一组中的元素。也许这就是你想要的,但如果你真的想要其中一个,我会描述这两个选项。
我们需要的工具
正如在此处和此处的其他 SO 问题中发现的那样,我们可以使用以下任何一种找到正确的条目集LINQ Set Operations
:
您可以在 MSDN 中进一步探索这些中的每一个,但正如此SO Question中提到的,仅供参考,Union
并且Concat
都会将一个可枚举附加到另一个上,但 Union 将删除重复项(在检查DataRow
s 的相等性时,您必须传入重载IEqualityComparer
= DataRowComparer.Default
)
此外,我们还想枚举一个 DataTable,所以要做到这一点,我们需要AsEnumerable
从命名空间调用该方法DataTableExtensions
。
解决方案设置
就像我们正在查看相同的代码一样,这里有一些基本的数据表,我们可以在这些数据表上执行集合操作
Dim dt, dataTable1, dataTable2 As New DataTable
With dt.Columns
.Add("ID", GetType(Integer))
.Add("Name", GetType(String))
End With
dataTable1 = dt.Clone
dataTable2 = dt.Clone
With dataTable1.Rows
.Add(1, "Tod")
.Add(2, "Jim")
End With
With dataTable2.Rows
.Add(2, "Jim")
.Add(3, "Han")
End With
解决方案集
因此,如果您只想要第二个表中未出现在第一个表中的新项目,那么您需要Right Outer Join
:
如果您想要两组之间不同的所有数据,您需要Full Outer Join
排除Inner Join
您可以在这篇 Jeff Atwood帖子中阅读有关不同集合和创建它们的连接的更多信息。
代码
如果你想要第一个选项,你可以通过调用Except
第二个Datatable
并传入第一个来获取第二个集合中的元素
Dim just2 As DataTable
just2 = dataTable2.AsEnumerable _
.Except(dataTable1.AsEnumerable, DataRowComparer.Default) _
.CopyToDataTable()
输出将是:
| ID | Name |
| 3 | Han |
如果您想要每组中的唯一值,则必须调用 distinct 两次,然后加入这两个值。我们不需要将 传递DataRowComparer
给该Union
方法,因为我们已经保证两个表中没有重复项
Dim just1 As IEnumerable(Of DataRow)
Dim just2 As IEnumerable(Of DataRow)
Dim union As DataTable
'get rows that are only in table1
just1 = dataTable1.AsEnumerable.Except(dataTable2.AsEnumerable, DataRowComparer.Default)
'get rows that are only in table2
just2 = dataTable2.AsEnumerable.Except(dataTable1.AsEnumerable, DataRowComparer.Default)
'get all unique rows
union = just1.Union(just2).CopyToDataTable
由于我们不需要单独的唯一元素集,因此无需调用CopyToDataTable
just 以便我们可以重新转换为IEnumerable(Of DataRow)
withAsEnumerable
联合的输出将是:
| ID | Name |
| 1 | Tod |
| 3 | Han |