.net 这个循环有什么问题

qv7cva1a  于 2023-03-24  发布在  .NET
关注(0)|答案(4)|浏览(88)

我使用一个循环条件来检查列中是否有空值,然后将其删除。
-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循环并抛出一个错误,即没有具有该索引的列。
你们发现这个代码有什么问题吗?

t9eec4r0

t9eec4r01#

语句dt1.Columns.Count在for循环的最开始被求值。它不会在每次循环运行时重新求值。
所以当你在循环体中删除一个列时,它会导致循环的结束条件出错。

uidvcgyl

uidvcgyl2#

我猜i-loop只计算一次停止值。

y0u0uwnf

y0u0uwnf3#

改变循环对象是个坏主意。这可能在某些情况下会有影响。我会在第一个表上复制你的datatable循环,然后改变第二个表。
另外,你看过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
7kqas0il

7kqas0il4#

由于您是在外部循环中进行删除,因此不要依赖于dt1.Columns.Count的重新求值
此外,尝试倒计时而不是倒计时(因为如果您在倒计时中删除了一列,它不会影响下一个有效索引)
对于你的外部循环,类似这样:
警告:我是一个c#开发人员,我的vb for循环语法可能会关闭读取:我想从最高的列号向下循环到列

'' // 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,当我得到0时,我仍然完成了。

相关问题