Изменение переменных приращения приводит к тому, что цикл переходит предел - PullRequest
1 голос
/ 04 ноября 2010

В моем цикле я пытаюсь удалить элементы из списка с определенным именем.Я не могу сделать это с for-each, поэтому я попробовал обычный цикл for.Кажется, цикл for работает не так, как ожидалось.Это всегда идет за предел.Мне пришлось поставить if-then, чтобы вырваться из цикла (очень некрасивое решение).Я пытаюсь найти правильный способ сделать это.

Dim canShowNextTable As Boolean = False
    Dim allTablesInTab As List(Of Control) = ctrlFinder.GetTypeOfControls("Table", parentForm.Controls)
    Dim totalTables As Integer = allTablesInTab.Count - 1
    For i As Integer = 0 To totalTables
        If allTablesInTab.Item(i).ID = "CustomerTable" Or _
            allTablesInTab.Item(i).ID = "PMTable" Or _
            allTablesInTab.Item(i).ID = "TableAListClrnCheck" Or _
            allTablesInTab.Item(i).ID = "TableBListClrnCheck" Or _
            allTablesInTab.Item(i).ID = "TableCListClrnCheck" Or _
            allTablesInTab.Item(i).ID = "TableDListClrnCheck" Or _
            allTablesInTab.Item(i).ID = "TableSignature" Then       '' If the ID is one of these remove it from list
            allTablesInTab.Remove(allTablesInTab.Item(i))
            totalTables = totalTables - 1                           '' Decrement number of tables to loop through
            i = -1                                                  '' Reset counter to prevent going over or premature stopping
        End If
        If i = 3 AndAlso totalTables = 3 Then                       '' Since loop continuously goes over limit, use if-then to exit for-loop
            Exit For
        End If
    Next

1 Ответ

3 голосов
/ 04 ноября 2010

Вам нужно пройти через петлю в обратном порядке, потому что после удаления элемента общее количество изменилось и больше не является правильным.Обратный цикл позволяет избежать этой проблемы.

For i As Integer = totalTables To 0 Step -1

Кроме того, вместо allTablesInTab.Remove(allTablesInTab.Item(i)) вы можете использовать:

allTablesInTab.RemoveAt(i)

Прорабатывать эту логику на бумаге или в отладчике, чтобы правильно понять концепциюо том, что происходит.Вы также можете найти этот связанный вопрос полезным.Это в C #, но концепции те же: Как удалить элементы из общего списка при переборах по нему?

...