我解析了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
答案 0 :(得分:5)
使用For Each
枚举时,您无法修改该集合,但可以使用简单的For
循环。您需要向后循环以避免在删除行后跳过该行。
你的测试也是错误的;如果Item(0)
返回Nothing
,则Item(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
答案 1 :(得分: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()