Еще одним видом управляющих конструкций являются циклы. В VB.NET используется несколько видов циклов.
For...Next
For Each...Next
While
Do
В этом цикл выполняется определенное число раз, причем это число задается счетчиком:
For i As Integer = 1 To 9
Console.WriteLine("Квадрат числа {0} равен {1}", i, i * i)
Next
Здесь переменная i выполняет роль счетчика. После слова To мы помещаем максимальное значение счетчика. При каждом цикле значение счетчика увеличивается на единицу. И это значение сравнивается со значением после To. Если эти два значения равны, то цикла прекращает свою работу.
При работе с циклами мы можем увеличивать значение счетчика при каждом проходе не только на единицу, но и вообще на любое число. Для этого нужно либо использовать ключевое слово Step и после него указать шаг цикла, на который будет увеличиваться значение счетчика, либо можно увеличивать счетчик непосредственно в цикле:
For i As Integer = 1 To -9 Step -1
For j As Integer = 1 To 9
Console.WriteLine("Произведение чисел i и j равно {0}", i * j)
j += 1
Next
Next
Обратите внимание, что в качестве шага в первом цикле выбрано отрицательное значение и значение счетчика с каждым проходом уменьшается на единицу. Во внутреннем цикле счетчик j при каждом проходе увеличивается на 2, так как он по умолчанию увеличивается на единицу, и еще мы явным образом увеличиваем его в цикле на единицу. В итоге внутренний цикл отрабатывает пять раз, а внешний девять, то есть фактически получается 45 циклов.
Цикл For Each осуществляет перебор элементов в определенной группе, например, в массиве или в коллекции. Предположим у нас есть некоторый массив типа Integer и нам надо инициализировать этот массив случайными значениями и затем вывести все его элементы на экран:
'Создаем массив из пяти чисел
Dim nums(4) As Integer
Dim r As New Random()
'инициализируем массив
For i As Integer = 0 To nums.Length - 1
nums(i) = r.Next(100)
Next
'Выводим элементы массива
For Each i As Integer In nums
Console.Write("{0} ", i)
Next
В выражении For Each мы сначала указываем переменную, которая будет принимать значения элементов массива. А после ключевого слова In указываем группу, в которой надо перебрать все элементы.
В цикл While выполняется до тех пор, пока соблюдается определенное условие, указанное после слова While:
Dim j As Integer = 10
While j > 0
Console.WriteLine(j)
j -= 1
End While
Цикл Do, также как и цикл While, выполняется, пока соблюдается определенное условие. Однако он имеет разные формы. Так, в следующем примере сначала проверяется условие, а затем выполняется блок кода, определенный в цикле:
Dim j As Integer = 10
Do While j > 0
Console.WriteLine(j)
j -= 1
Loop
В данном случае цикл выполняется, пока значение j больше нуля. Но есть еще одна запись, где вместо слова While используется слово Until, а цикл выполняется пока не соблюдено определенное условие, то есть пока значение j не станет меньше нуля:
Dim j As Integer = 10
Do Until j < 0
Console.WriteLine(j)
j -= 1
Loop
Если изначально условие, заданное в цикле, неверно, то цикл не будет работать. Но мы можем определить проверку в конце цикла, и таким образом, наш цикл как минимум один раз отработает:
Dim j As Integer = -1
Do
Console.WriteLine(j)
j -= 1
Loop Until j < 0
'либо
Do
Console.WriteLine(j)
j -= 1
Loop While j > 0
Нередко возникает необходимость не дожидаться окончания цикла, а сразу же выйти из цикла, в случае соблюдения определенного условия. Для
этого используют оператор Exit, после которого указывают тип цикла, из которого осуществляется выход, например, Exit Do (Exit While):
Dim r As New Random()
Dim num As Integer = r.Next(100)
For i As Integer = 0 To 100
num -= 1
If num < 50 Then Exit For
Next
Console.WriteLine(num)
Существует и другая задача - осуществить выход не из цикла, а из текущего прохода или итерации и перейти к следующему. Для этого используют
оператор Continue, после которого указывают тип цикла, из которого осуществляется выход, например, Continue While:
Dim r As New Random()
Dim num As Integer = r.Next(100)
For i As Integer = 0 To 10
num -= 7
If num < 50 AndAlso num > 25 Then
Continue For
End If
Console.WriteLine(num)
Next
В данном случае мы в каждом проходе цикла вычитаем из num число 7 и затем смотрим, не принадлежит ли число num интервалу от 25 до 50. И если принадлежит, переходим к новой итерации цикла, а если нет, то выводим его на экран.