Visual Basic .NET Language
перекручивание
Поиск…
Для ... Далее
For
... Next
цикл используется для повторения одного и того же действия в течение конечного числа раз. Операторы внутри следующего цикла будут выполняться 11 раз. В первый раз у i
будет значение 0, во второй раз оно будет иметь значение 1, в последний раз оно будет иметь значение 10.
For i As Integer = 0 To 10
'Execute the action
Console.Writeline(i.ToString)
Next
Любое целочисленное выражение может использоваться для параметризации цикла. Допускается, но не требуется, для управляющей переменной (в данном случае i
) также указываться после Next
. Допускается, чтобы управляющая переменная была объявлена заранее, а не в инструкции For
.
Dim StartIndex As Integer = 3
Dim EndIndex As Integer = 7
Dim i As Integer
For i = StartIndex To EndIndex - 1
'Execute the action
Console.Writeline(i.ToString)
Next i
Возможность определять начальные и конечные целые числа позволяет создавать циклы, которые непосредственно ссылаются на другие объекты, такие как:
For i = 0 to DataGridView1.Rows.Count - 1
Console.Writeline(DataGridView1.Rows(i).Cells(0).Value.ToString)
Next
Затем это будет проходить через каждую строку в DataGridView1
и выполнить действие записи столбца 1 в консоль. (-1 - это потому, что первая строка подсчитанных строк будет равна 1, а не 0)
Также возможно определить, как должна изменяться управляющая переменная.
For i As Integer = 1 To 10 Step 2
Console.Writeline(i.ToString)
Next
Эти результаты:
1 3 5 7 9
Также возможно уменьшить управляющую переменную (обратный отсчет).
For i As Integer = 10 To 1 Step -1
Console.Writeline(i.ToString)
Next
Эти результаты:
10 9 8 7 6 5 4 3 2 1
Не следует пытаться использовать (читать или обновлять) управляющую переменную вне цикла.
Для каждого ... Следующий цикл для циклического набора элементов
Вы можете использовать цикл For Each...Next
чтобы перебирать любой тип IEnumerable
. Сюда входят массивы, списки и все, что может быть типа IEnumerable или возвращает IEnumerable.
Пример цикла с использованием свойства Rows DataTable будет выглядеть так:
For Each row As DataRow In DataTable1.Rows
'Each time this loops, row will be the next item out of Rows
'Here we print the first column's value from the row variable.
Debug.Print(Row.Item(0))
Next
Важно отметить, что сбор не должен изменяться в цикле For Each
. Это приведет к System.InvalidOperationException
с сообщением:
Коллекция была изменена; операция перечисления может не выполняться.
Пока цикл повторяется, пока выполняется какое-то условие
Цикл While
начинается с оценки состояния. Если это правда, выполняется тело цикла. После того, как тело цикла выполнено, условие While
снова оценивается, чтобы определить, следует ли повторно выполнять тело.
Dim iteration As Integer = 1
While iteration <= 10
Console.Writeline(iteration.ToString() & " ")
iteration += 1
End While
Эти результаты:
1 2 3 4 5 6 7 8 9 10
Предупреждение: цикл While
может привести к бесконечному циклу . Подумайте, что произойдет, если строка кода, которая увеличивает iteration
, будет удалена. В таком случае условие никогда не будет истинным, и цикл продолжится бесконечно.
Do ... Loop
Используйте Do...Loop
для повторения блока операторов While
или Until
условие не будет истинным, проверьте условие либо в начале, либо в конце цикла.
Dim x As Integer = 0
Do
Console.Write(x & " ")
x += 1
Loop While x < 10
или же
Dim x As Integer = 0
Do While x < 10
Console.Write(x & " ")
x += 1
Loop
0 1 2 3 4 5 6 7 8 9
Dim x As Integer = 0
Do
Console.Write(x & " ")
x += 1
Loop Until x = 10
или же
Dim x As Integer = 0
Do Until x = 10
Console.Write(x & " ")
x += 1
Loop
0 1 2 3 4 5 6 7 8 9
Continue Do
можно использовать для перехода к следующей итерации цикла:
Dim x As Integer = 0
Do While x < 10
x += 1
If x Mod 2 = 0 Then
Continue Do
End If
Console.Write(x & " ")
Loop
1 3 5 7 9
Вы можете завершить цикл с помощью Exit Do
- обратите внимание, что в этом примере отсутствие какого-либо условия в противном случае вызовет бесконечный цикл:
Dim x As Integer = 0
Do
Console.Write(x & " ")
x += 1
If x = 10 Then
Exit Do
End If
Loop
0 1 2 3 4 5 6 7 8 9
Короткое замыкание
Любой цикл может быть прекращен или продолжен в начале в любой момент с помощью операторов Exit
или Continue
.
Выход
Вы можете остановить любой цикл, выйдя рано. Для этого вы можете использовать ключевое слово Exit
вместе с именем цикла.
петля | Заявление о выходе |
---|---|
За | Exit For |
Для каждого | Exit For |
Делать пока | Exit Do |
В то время как | Exit While |
Выход из цикла на ранней стадии - отличный способ повысить производительность, только зацикливая необходимое количество раз, чтобы удовлетворить потребности приложения. Ниже приведен пример, когда цикл выйдет, как только он найдет номер 2
.
Dim Numbers As Integer() = {1,2,3,4,5}
Dim SoughtValue As Integer = 2
Dim SoughtIndex
For Each i In Numbers
If i = 2 Then
SoughtIndex = i
Exit For
End If
Next
Debug.Print(SoughtIndex)
продолжающийся
Наряду с выходом рано, вы также можете решить, что вам нужно просто перейти к следующей итерации цикла. Это легко сделать, используя оператор Continue
. Так же, как и « Exit
, это имя цикла.
петля | Продолжить заявление |
---|---|
За | Continue For |
Для каждого | Continue For |
Делать пока | Continue Do |
В то время как | Continue While |
Вот пример предотвращения того, чтобы четные числа добавлялись к сумме.
Dim Numbers As Integer() = {1,2,3,4,5}
Dim SumOdd As Integer = 0
For Each i In Numbers
If Numbers(i) \ 2 = 0 Then Continue For
SumOdd += Numbers(i)
Next
Советы по использованию
Существует два альтернативных метода, которые можно использовать вместо использования Exit
или Continue
.
Вы можете объявить новую логическую переменную, инициализируя ее одним значением и условно устанавливая ее на другое значение внутри цикла; вы затем используете условную инструкцию (например, If
) на основе этой переменной, чтобы избежать выполнения операторов внутри цикла в последующих итерациях.
Dim Found As Boolean = False
Dim FoundIndex As Integer
For i As Integer = 0 To N - 1
If Not Found AndAlso A(i) = SoughtValue Then
FoundIndex = i
Found = True
End If
Next
Одно из возражений против этого метода заключается в том, что оно может быть неэффективным. Например, если в приведенном выше примере N
равно 1000000, а первый элемент массива A
равен SoughtValue
, цикл будет повторять еще 999999 раз, не делая ничего полезного. Однако этот метод может иметь преимущество большей ясности в некоторых случаях.
Вы можете использовать инструкцию GoTo
чтобы выскочить из цикла. Обратите внимание: вы не можете использовать GoTo
для перехода в цикл.
Dim FoundIndex As Integer
For i As Integer = 0 To N - 1
If A(i) = SoughtValue Then
FoundIndex = i
GoTo Found
End If
Next
Debug.Print("Not found")
Found:
Debug.Print(FoundIndex)
Этот метод иногда может быть самым простым способом выскочить из цикла и избежать одного или нескольких операторов, которые выполняются сразу после естественного конца цикла.
Вы должны рассмотреть все альтернативы и использовать то, что лучше всего соответствует вашим требованиям, учитывая такие факторы, как эффективность, скорость написания кода и читаемость (таким образом, ремонтопригодность).
Не откладывайте использование GoTo
в тех случаях, когда это лучшая альтернатива.
Вложенная петля
A nested loop is a loop within a loop, an inner loop within the body of an outer one. How this works is that the first pass of the outer loop triggers the inner loop, which executes to completion. Then the second pass of the outer loop triggers the inner loop again. This repeats until the outer loop finishes. a break within either the inner or outer loop would interrupt this process.
Структура следующего вложенного цикла:
For counter1=startNumber to endNumber (Step increment)
For counter2=startNumber to endNumber (Step increment)
One or more VB statements
Next counter2
Next counter1
Пример :
For firstCounter = 1 to 5
Print “First Loop of ” + firstCounter
For secondCounter= 1 to 4
Print “Second Loop of ” + secondCounter
Next secondCounter
Next firstCounter