这个循环有什么问题

时间:2010-02-15 20:50:36

标签: .net vb.net

我正在使用循环条件来检查列中是否有空值,然后将其删除。

-Original author

[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循环并抛出一个错误,即该索引没有列。我必须在这里遗漏一些东西,但我无法调试这个问题。

你们发现这段代码有什么问题吗?

4 个答案:

答案 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,当我达到零时我仍然完成。