如何计算:Datatable.rows.count不包括已删除的行

时间:2016-07-23 16:22:35

标签: vb.net dataset datarow

我一直这样做是为了避免从我的数据集中删除/删除行。

For Each drX As DataRow In myDataset.Tables("CustInno").Rows
    If drX.RowState <> DataRowState.Deleted Then
        iRunRows += 1
    End If
Next

有更快或更好的方法吗?

2 个答案:

答案 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

这些方法是否优于循环解决方案是对观察者的主观要求。

相关问题