我一直这样做是为了避免从我的数据集中删除/删除行。
For Each drX As DataRow In myDataset.Tables("CustInno").Rows
If drX.RowState <> DataRowState.Deleted Then
iRunRows += 1
End If
Next
有更快或更好的方法吗?
答案 0 :(得分:3)
“更好”是一个主观的术语。至于“更快”,无论如何,必须循环并检查RowState
。要做的一件事就是将循环放在一个函数中,这样你至少不会重复代码,并且可以在任何表上使用它:
Private Function ActiveRows(dt As DataTable) As Int32
... your loop
Resturn iRunRows
End Function
或者您可以使用扩展方法:
Dim activeRowCount = dt.AsEnumerable.
Count(Function(q) q.RowState <> DataRowState.Deleted).
它不太可能更快 - 某个地方必须循环 - 但它更短。
答案 1 :(得分:0)
DataTable
类提供了各种方法来获取基于DataRow.State
的行集。
'DataTable.Select` Method可能是最简单的。
dt.Select("", "", DataViewRowState.CurrentRows)
另一种方法是使用DataView并设置RowStateFilter
属性。此示例修改DataTable.DefaultView
属性,而不是创建独立的DataView
实例。
Dim dt As New DataTable
dt.Columns.Add("c1")
For i As Int32 = 1 To 100
dt.Rows.Add(i)
Next
dt.AcceptChanges()
Debug.Print(dt.Rows.Count.ToString()) ' prints 100
For i As Int32 = 99 To 0 Step -2
dt.Rows.Item(i).Delete()
Next
Debug.Print(dt.Rows.Count.ToString()) ' prints 100
dt.DefaultView.RowStateFilter = DataViewRowState.CurrentRows
Dim count As Int32 = dt.DefaultView.Count
Debug.Print(count.ToString()) ' prints 50
' loop thru DataView rows
For Each drv As DataRowView In dt.DefaultView
Dim dr As DataRow = drv.Row
Debug.Print(dr.Item(0).ToString())
Next
这些方法是否优于循环解决方案是对观察者的主观要求。