2016-07-23 2 views
0

나는 내 데이터 집합에서 제거/삭제 된 행을 피하기 위해 끊임없이이 작업을 수행하고 있습니다.계산 방법 : 삭제 된 행을 제외하고 Datatable.rows.count

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

이 작업을 수행하는 더 빠르고 좋은 방법이 있습니까?

답변

1

"더 나은"주관적인 용어입니다. "더 빠르다"에 관해서는, 무엇 이건간에, 무언가는 루프를 통과해야하고 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). 

더 빠를 가능성은 거의 없습니다 - 어딘가에 루프가 있어야하지만 더 짧습니다.

+0

나는 이것을 좋아한다. 1 라인. 쉬운. 감사. –

+0

@IvanPerez이 질문에 대한 답변이있는 경우 체크 표시를 클릭하면 UnAnswered List에서 벗어나 위쪽 화살표를 클릭하면 도움이됩니다. 답변과 득표를 허용하면 다른 사용자가 좋은 답변을 찾을 수 있습니다. – Plutonix

0

DataTable 클래스는 DataRow.State을 기반으로 행 세트를 얻는 다양한 방법을 제공합니다.

아마도 'DataTable.Select` Method 일 것입니다.

dt.Select("", "", DataViewRowState.CurrentRows)

또 다른

DataView를 사용하고 그것을 RowStateFilter 속성을 설정하는 것입니다. 이 예에서는 독립형 DataView 인스턴스를 만드는 대신 DataTable.DefaultView 속성을 수정합니다.

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 

이러한 방법이 루핑 솔루션보다 나은지 여부는 관찰자 측에서 주관적인 호출입니다.

+0

정보를 주셔서 감사합니다, 전 단지 currentrows를 선택하려하지 않았습니다. :) –

관련 문제