Основы C#. Часть 3. Циклы

180 прочитали

Сегодня рассмотрим тоже очень часто используемый в программировании инструмент — циклы. Они позволяют очень сильно расширить наши возможности и масштабировать код на неограниченный объём входных данных.

В языке C# используется 4 вида циклов, чаще всего применяется 3 из них: for, foreach и while. Их и рассмотрим.

Цикл for

Когда я начинал программировать, я не любил этот цикл, предпочитая более простой foreach. Но потом я осознал все его преимущества и теперь использую чаще остальных.

Общий синтаксис такой:

for (<действия перед всем циклом>; <условие>; <действие после каждой итерации>)
{
//тело цикла
}

И пример:

for (int i = 0; i<10; i++)
{
Console.WriteLine("Текущее значение: " + i);
}

И что всё это означает:

  1. <действия перед всем циклом> — int i = 0;

Мы объявляем переменную i — счётчик цикла. Это действие выполняется один раз перед первой итерацией. После него ставится точка с запятой.

В принципе, действие может быть любым, но в 90% случаев это "int i = 0;", ещё в 9% переменная носит другое имя (j или k), либо отсчёт начинается не с нуля.

2. <условие>; — i<10;

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

3. <действие после каждой итерации> — i++

По завершению выполнения тела цикла обязательно выполняется это действие. Как правило, это увеличение (++) или уменьшение (--) счётчика на единицу.

Результат выполнения примера цикла:

Сегодня рассмотрим тоже очень часто используемый в программировании  инструмент — циклы.

Как видите, числа 10 нет. Всё верно: 10 не меньше чем 10, условие вернуло false, и цикл завершился.

Цикл foreach

Этот цикл имеет более простой синтаксис. Он выполняет перебор по каждому элементу коллекции (списка, массива, словаря, и др.) и выполняет определённые действия для них всех.

Синтаксис:

foreach (Type type in Collection)
{
//тело цикла
}

Например:

List<int> integers = new List<int>() {0,10,20,30};
foreach (int i in integers)
{
Console.WriteLine(i);
}

В примере я создал и наполнил числами список из int — List<int>(), чтобы у цикла была коллекция, по которой он проходится. О разных типах коллекций я расскажу в других статьях.

Итак, рассмотрим подробнее:

foreach (Type type in Collection) — foreach (int i in integers)

  • Ключевое слово foreach
  • Type — int. Указываем тип данных в этой коллекции.
  • type — i. Это просто имя переменной, к которой обращается цикл. То есть при каждой итерации это просто имя текущего элемента.
  • in — ключевое слово.
  • Collection — integers. Имя коллекции, по которой проходит цикл. Коллекция должна быть объявлена заранее, иначе код не скомпилируется. Коллекция может быть пустой (0 элементов — 0 итераций цикла, но код скомпилируется и выполнится, это не проблема).

В качестве подходящей коллекции может использоваться любая коллекция, наследующая интерфейс IEnumerable. Все классические списки, массивы и словари наследуют его. В контексте Revit API нам это будет интересно вот чем:

Класс ConnectorSet наследует IEnumerable
Класс ConnectorSet наследует IEnumerable

Например, мы можем пройтись в цикле foreach по объекту класса ConnectorSet.

Важным нюансом foreach является то, что мы не можем изменять коллекцию. Нельзя удалить или добавить элемент (но можно изменить его свойство или параметр). Это частая ошибка новичков: желание очистить список, проверив условие внутри цикла foreach. Нужно использовать for или добавлять элементы в другой список.

А вот результат выполнения цикла из примера:

Сегодня рассмотрим тоже очень часто используемый в программировании  инструмент — циклы.-3

Цикл while

Тоже довольно простой цикл, на котором легко поймать бесконечное зацикливание при неосторожности.

Синтаксис:

while (условие)
{
// тело цикла
}

Например:

int i =10;
while (i>0)
{
Console.WriteLine(i);
i--;
}

После ключевого слова while в скобках пишется условие (выражение в скобках должно возвращать bool). Если условие выполняется, то выполняются инструкции в фигурных скобках. Если не выполняется, то цикл завершается.

В отличии от цикла for, у while нет обязательного пункта "действие после каждой итерации". Поэтому, если бы я в своём примере забыл написать строчку i--; то получилась бы ситуация, когда на консоль бесконечно выводится число 10. При этом никакой ошибки не будет: программа не выключится и не поймает исключение.

Результат выполнения цикла из примера:

Сегодня рассмотрим тоже очень часто используемый в программировании  инструмент — циклы.-4

Операторы break и continue

Иногда случаются ситуации, что нам нужно пропустить итерацию цикла. Допустим, мы корректируем элементы коллекции по какому-либо признаку, и если с ними и так всё хорошо, просто переходим к следующему. Тогда нам поможет оператор continue. Он говорит "перейти к следующей итерации".

List<int> integers = new List<int>() { 0, 10, 20, 30, 40, 50 };
for(int i = 0; i < integers.Count; i++)
{
if (integers[i] == 0)
{
continue;
}
integers[i] = integers[i] / integers[i];
Console.WriteLine(integers[i]);
}

Здесь мы записываем в список результат деления числа из списка на себя. Но если в списке 0, то его пропускаем. Результат:

Сегодня рассмотрим тоже очень часто используемый в программировании  инструмент — циклы.-5

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

for (int i = 20; i > 0; i--)
{
if (i % 7 == 0)
{
break;
}
Console.WriteLine(i);
}

Результат:

Сегодня рассмотрим тоже очень часто используемый в программировании  инструмент — циклы.-6

Так же у меня есть телеграм-канал о Revit API. Подписывайтесь, буду рад видеть вас там. До новых встреч!

Сегодня рассмотрим тоже очень часто используемый в программировании  инструмент — циклы.-7