我正在使用循环条件来检查列中是否有空值,然后将其删除。
[STart:]
For i As Integer = counter To dt1.Columns.Count - 1
For x As Integer = 0 To dt1.Rows.Count - 1
if some condition then
something = true
else
something = false
counter = counter + 1
Goto [Start]
end if
Next
If something = true
dt1.Columns.Remove(dt1.Columns(i))
i -= 1
End If
Next
End If
有时它运行正常,有时即使i
变得大于(dt.columns.count - 1)
,它仍会执行for循环并抛出一个错误,即该索引没有列。我必须在这里遗漏一些东西,但我无法调试这个问题。
你们发现这段代码有什么问题吗?
答案 0 :(得分:4)
语句dt1.Columns.Count
在for循环的最开始进行评估。每次循环运行时都不会重新评估它。
因此,当您删除循环体中的列时,会导致循环的结束条件出错。
答案 1 :(得分:3)
我猜测i-loop只计算一次停止值。
答案 2 :(得分:2)
改变循环对象是个坏主意。在某些情况下,这可能会产生影响。我会在第一个表上复制你的数据表 - 循环并改变第二个。
另外,你见过Select method on datatable吗?它可能使嵌入循环(在列上循环并调用select)
更容易搜索空值Dim DRs AS DataRow() = dt1.Select(dt1.Columns(i).ColumnName " IS NULL")
If DRs.Count > 0 Then
'' // do something
End If
答案 3 :(得分:1)
由于您在外部循环中删除,因此不要依赖于重新评估dt1.Columns.Count
此外,尝试向下计数而不是向上计数(因为如果您在倒计时中删除一列,则不会影响下一个有效索引的位置)
你的外环这样的东西:
警告:我是一名c#开发人员,我的vb for循环语法可能已关闭 读:我想从最高列号循环到第0列
'' // leave no question as to how often count will be evaluated.
'' // we will ensure it happens only once:
Dim colmns as int = dt1.Columns.Count - 1
for i as integer = columns to 0 step -1
'' // your logic goes here
'' // DON'T manualy modify the value of i -- it will always be right.
Next
反过来效果更好。想想这样: 说我有4列,我在#3上。 如果#3非空,我将不管它,我的下一列是#2 如果#3为空,我将删除它,但我的下一列仍然是#2,当我达到零时我仍然完成。