2010-02-15 63 views
1

我正在使用循環條件檢查列中是否存在空值,然後將其刪除。此循環出了什麼問題

-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循環,並拋出一個錯誤,沒有與該索引沒有列。我必須在這裏失去一些東西,但我無法調試問題。

你們是否發現此代碼有問題?

+0

不知道爲什麼你在這裏得票低。這是本網站的內容。將問題發佈到其他程序員的網絡上。從我+1。 – 2010-02-15 21:32:45

+0

我也不確定:(可能是他們是不錯的程序員,他們不喜歡我這樣的程序員犯錯誤並試圖學習 – 2010-02-15 21:40:29

回答

4

聲明dt1.Columns.Count在的一開始for循環評估。每次循環運行時都不會重新評估。

所以,當你在循環體中刪除一列時,它會導致循環的結束條件出錯。

+0

好的我錯過了這裏的東西看更新的代碼 – 2010-02-15 21:04:43

+0

我改變了我的循環while循環,它運行正確地 – 2010-02-15 21:33:02

3

我猜i-loop只評估停止值一次。

2

改變你正在循環的對象是一個壞主意。這可能會在某些情況下產生影響。我會複製你的數據表循環在第一張桌子上,並改變第二張。

此外,你見過Select method on datatable?這可能使本次搜索的空值那麼容易嵌入的循環(循環的列和通話選擇)

Dim DRs AS DataRow() = dt1.Select(dt1.Columns(i).ColumnName " IS NULL") 
If DRs.Count > 0 Then 
    '' // do something 
End If 
1

因爲你在你的外環刪除,不依賴於dt1.Columns.Count

的reevalution此外,嘗試倒計時代替了(因爲如果你刪除你的數列中向下,也不會影響下一個有效的指標是什麼)

像這樣的東西你外環:

警告:我是一個C#開發人員,我對VB的循環語法可能會關閉 讀:我想從最高列號向下循環到列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,並且我仍然完成我達到零。