我有两个数据表,其中一个在应用程序启动时填充,另一个在单击按钮时填充。如何检查(最快方式)第二个数据表中是否有任何更改?
我已经尝试过了,但是不起作用:
For Each row1 As DataRow In dtt.Rows
For Each row2 As DataRow In dtt1.Rows
Dim array1 = row1.ItemArray
Dim array2 = row2.ItemArray
If array1.SequenceEqual(array2) Then
Else
End If
Next
Next
答案 0 :(得分:0)
问题在于您的循环是嵌套的。这意味着内部的For Each对dtt1
的每一行循环遍历dtt
的每一行。这不是您想要的。您要并行循环两个表。您可以通过使用For Each
语句在内部使用的枚举器来做到这一点
Dim tablesAreDifferent As Boolean = False
If dtt.Rows.Count = dtt1.Rows.Count Then
Dim enumerator1 = dtt.Rows.GetEnumerator()
Dim enumerator2 = dtt1.Rows.GetEnumerator()
Do While enumerator1.MoveNext() AndAlso enumerator2.MoveNext()
Dim array1 = enumerator1.Current.ItemArray
Dim array2 = enumerator2.Current.ItemArray
If Not array1.SequenceEqual(array2) Then
tablesAreDifferent = True
Exit Do
End If
Loop
Else
tablesAreDifferent = True
End If
If tablesAreDifferent Then
'Display message
Else
'...
End If
枚举器的工作方式如下:它们具有一个内部游标,该游标最初位于第一行之前。在通过Current
属性访问一行之前,必须使用MoveNext
函数将其移至该行。如果成功,则此函数返回布尔值True
,即,只要有可用行,就可以返回。
由于现在我们有一个循环语句,并且在每个循环处前进enumerator1
和enumerator2
的光标,所以我们可以比较对应的行。
请注意,Rows
集合实现了IEnumerable
,因此GetEnumerator
返回的枚举数不是强类型的。即Current
键入为Object
。相反,如果您写
Dim enumerator1 = dtt.Rows.Cast(Of DataRow).GetEnumerator()
Dim enumerator2 = dtt1.Rows.Cast(Of DataRow).GetEnumerator()
然后,您将获得类型为IEnumerator(Of DataRow)
的枚举数,它们将返回强类型的DataRow
。