【发布时间】:2016-11-27 09:19:29
【问题描述】:
我一直这样做是为了避免从我的数据集中删除/删除行。
For Each drX As DataRow In myDataset.Tables("CustInno").Rows
If drX.RowState <> DataRowState.Deleted Then
iRunRows += 1
End If
Next
有没有更快或更好的方法来做到这一点?
【问题讨论】:
我一直这样做是为了避免从我的数据集中删除/删除行。
For Each drX As DataRow In myDataset.Tables("CustInno").Rows
If drX.RowState <> DataRowState.Deleted Then
iRunRows += 1
End If
Next
有没有更快或更好的方法来做到这一点?
【问题讨论】:
“更好”是一个主观术语。至于“更快”,无论如何,必须循环并检查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).
它不可能更快 - 某处必须循环 - 但它更短。
【讨论】:
DataTable类提供了各种方法来获取基于DataRow.State的行集。
'DataTable.Select` Method也许是最简单的。
dt.Select("", "", DataViewRowState.CurrentRows)
另一个是使用DataView并设置它RowStateFilter属性。此示例修改DataTable.DefaultViewpryore,然后在创建独立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
这些方法是否优于循环解决方案是观察者部分上的主观呼叫。
【讨论】: