2

Excelスプレッドシートを解析し、結果全体をDataTableとして返しました。ただし、このExcelスプレッドシートには、結果のDataTableから削除したい空の行がいくつかあります。特に、各空の行は空のセルで始まります。したがって、最初のインデックスのセルの値が空の場合、行全体が空であることがわかります。クライアントから送信されたものを正確に処理する必要があるため、Excelスプレッドシートを単純に変更することはできないことに注意してください。この情報に基づいて、次の関数を実行して空の行を削除できると思いました。

' DataTable dt has already been populated with the data

For Each row As DataRow In dt.Rows
    If dt.Rows.Item(0).ToString = "" Then
        dt.Rows.Remove(row)
    ElseIf dt.Rows.Item(0) Is Nothing Then
        dt.Rows.Remove(row)
    End If
Next

ただし、このソリューションを作成した後、次のエラーが表示されます。

Collection was modified; enumeration operation might not execute.

コレクションにアクセスするときに、コレクションを変更できないことに気付きました。どうすればこれを回避できますか?空ではない行を使用して新しいDataTableを作成する必要があるかどうか疑問に思っています。これが最善のアプローチですか、それともより良いオプションがありますか?

編集:私はまた、行を逆方向に反復しようとしました:

For i = dt.Rows.Count() - 1 To 0
    If dt.Rows.Item(i).Item(0).ToString = "" Then
        dt.Rows.RemoveAt(i)
    End If
Next
4

2 に答える 2

6

で列挙している間はコレクションを変更できませんFor Eachが、単純なForループは機能します。行が削除された後に行をスキップしないように、逆方向にループする必要があります。

また、テストの方法が間違っています。Item(0)を返す場合はNothingItem(0).ToStringをスローしNullReferenceExceptionます。

dt.Rows.Item(0)はタイプミスだと思いますが、row.Item(0)代わりに読む必要があります。

For i As Integer = dt.Rows.Count - 1 To 0 Step -1
    Dim row As DataRow = dt.Rows(i)
    If row.Item(0) Is Nothing Then
       dt.Rows.Remove(row)
    ElseIf row.Item(0).ToString = "" Then
       dt.Rows.Remove(row)
    End If
Next
于 2012-12-20T19:02:31.127 に答える
0

linqを使用したVb.Net

 Dtset.Tables(0).AsEnumerable().Where(Function(row) row.ItemArray.All(Function(field) field Is Nothing Or field Is DBNull.Value Or field.Equals(""))).ToList().ForEach(Sub(row) row.Delete())
        Dtset.Tables(0).AcceptChanges()
于 2019-07-29T06:53:40.783 に答える