Использование цикла for
Когда требуется повторять блок кода фиксированное количество раз, хороший уровень гибкости предлагает оператор for. В действительности вы имеете возможность указывать, сколько раз должен повторяться блок кода, а также задавать условие завершения. Не вдаваясь в излишние подробности, ниже представлен пример синтаксиса:
// Базовый цикл for.
static void ForLoopExample()
{
// Обратите внимание, что переменная i видима только в контексте цикла for.
for(int i = 0; i < 4; i++)
{
Console.WriteLine("Number is: {0} ", i);
}
// Здесь переменная i больше видимой не будет.
}
Все трюки, которые вы научились делать в языках С, C++ и Java, по-прежнему могут использоваться при формировании операторов for в С#. Допускается создавать сложные условия завершения, строить бесконечные циклы и циклы в обратном направлении (посредством операции --), а также применять ключевые слова goto, continue и break.
Использование цикла foreach
Ключевое слово foreach языка C# позволяет проходить в цикле по всем элементам внутри контейнера без необходимости в проверке верхнего предела. Тем не менее, в отличие от цикла for цикл foreach будет выполнять проход по контейнеру только линейным (п+1) образом (т.е. не получится проходить по контейнеру в обратном направлении, пропускать каждый третий элемент и т.п.).
Однако если нужно просто выполнить проход по коллекции элемент за элементом, то цикл foreach будет великолепным выбором. Ниже приведены два примера использования цикла foreach — один для обхода массива строк и еще один для обхода массива целых чисел. Обратите внимание, что тип, указанный перед ключевым словом in, представляет тип данных контейнера.
// Проход по элементам массива посредством foreach.
static void ForEachLoopExample()
{
string[] carTypes = {"Ford", "BMW", "Yugo", "Honda" };
foreach (string c in carTypes)
{
Console.WriteLine(c);
}
int[] myInts = { 10, 20, 30, 40 };
foreach (int i in myInts)
{
Console.WriteLine(i);
}
}
За ключевым словом in может быть указан простой массив (как в приведенном примере) или, точнее говоря, любой класс, реализующий интерфейс IEnumerable. Как вы увидите в главе 10, библиотеки базовых классов .NET Core поставляются с несколькими коллекциями, которые содержат реализации распространенных абстрактных типов данных. Любой из них (скажем, обобщенный тип List<T>) может применяться внутри цикла foreach.
Использование неявной типизации в конструкциях foreach
В итерационных конструкциях foreach также допускается использование неявной типизации. Как и можно было ожидать, компилятор будет выводить корректный "вид типа". Вспомните пример метода LINQ, представленный ранее в главе. Даже не зная точного типа данных переменной subset, с применением неявной типизации все-таки можно выполнять итерацию по результирующему набору. Поместите в начало файла следующий оператор using:
using System.Linq;
static void LinqQueryOverInts()
{
int[] numbers = { 10, 20, 30, 40, 1, 2, 3, 8 };
// Запрос LINQ!
var subset = from i in numbers where i < 10 select i;
Console.Write("Values in subset: ");
foreach (var i in subset)
{
Console.Write("{0} ", i);
}
}
Использование циклов while и do/while
Итерационная конструкция while удобна, когда блок операторов должен выполняться до тех пор, пока не будет удовлетворено некоторое условие завершения. Внутри области видимости цикла while необходимо позаботиться о том, чтобы это условие действительно удовлетворялось, иначе получится бесконечный цикл. В следующем примере сообщение "In while loop" будет постоянно выводиться на консоль, пока пользователь не завершит цикл вводом yes в командной строке: