Перейти к основному содержимому

Итерация блока кода с помощью оператора for в C#.

Введение

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

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

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

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

Цели обучения

В этом модуле вы узнаете:

  • Как использовать оператор for для выполнения цикла в блоке кода.
  • Изучите синтаксис оператора for, который позволяет управлять шаблоном итерации.

Упражнение - Создание и настройка итерационных циклов

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

Что такое оператор for?

Оператор for выполняет итерацию по блоку кода определенное количество раз. Такой уровень контроля делает оператор for уникальным среди других операторов итерации. Оператор foreach выполняет итерацию по блоку кода один раз для каждого элемента в последовательности данных, например массива или коллекции. Оператор while итерирует блок кода до тех пор, пока не будет выполнено условие.

Кроме того, оператор for дает вам гораздо больше контроля над процессом итерации, поскольку раскрывает условия итерации.

В этом упражнении вы будете использовать оператор for, научитесь управлять предварительным условием, условием завершения итерации, шаблоном итерации и т. д. Кроме того, вы узнаете о типичных случаях использования оператора for.

Напишите основной оператор for

  1. Создайте новый пустой проект
  2. Введите следующий код в редактор кода Visual Studio.
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}

Этот код представляет собой простой оператор for, который проходит через свой блок кода 10 раз, выводя текущее значение i.

  1. Сохраните файл и запустите код на выполнение
0
1
2
3
4
5
6
7
8
9
  1. Уделите минуту тому, чтобы определить шесть частей оператора for.

Оператор for включает в себя следующие шесть частей:

  • Ключевое слово for.
  • Набор круглых скобок, определяющий условия итерации for. Круглые скобки содержат три отдельные части, разделенные оператором конца оператора - точкой с запятой.
  • Первая часть определяет и инициализирует переменную итератора. В данном примере: int i = 0. Эта часть называется инициализатором.
  • Вторая часть определяет условие завершения. В данном примере: i < 10. Другими словами, время выполнения будет продолжать итерацию кода в блоке кода ниже оператора for, пока i меньше 10. Когда i становится равным 10, время выполнения прекращает выполнение блока кода оператора for. В документации этот раздел называется условием.
  • Третья часть определяет действие, которое должно выполняться после каждой итерации. В данном случае после каждой итерации i++ будет увеличивать значение i на 1. В документации этот раздел называется итератором.
  • Наконец, блок кода. Блок кода содержит код, который будет выполняться на каждой итерации. Обратите внимание, что на значение i есть ссылка внутри блока кода. В документации этот раздел называется телом.

Учитывая наши правила именования переменных, вы можете задаться вопросом, является ли i допустимым именем для переменной, в которой хранится текущая итерация. В данном случае i, по мнению большинства, является допустимым. Другими популярными вариантами являются x и counter. Имя j также используется в тех случаях, когда у вас есть внешний оператор for, использующий i, и вам нужно создать итерационную переменную для внутреннего оператора for.

примечание

Все три секции (инициализатор, условие и итератор) являются необязательными. Однако на практике обычно используются все три секции.

Измените условия итерации

Как мы уже говорили в самом начале, оператор for обладает двумя уникальными свойствами среди операторов итерации.

Оператор for следует использовать, когда вы заранее знаете, сколько раз вам нужно выполнить итерацию в блоке кода. Оператор for позволяет вам контролировать способ обработки каждой итерации.

Что, если нам нужно выполнить итерацию блока кода, но при этом мы хотим вести отсчет не вверх, а вниз?

  1. С помощью редактора кода Visual Studio обновите код следующим образом:
for (int i = 10; i >= 0; i--)
{
Console.WriteLine(i);
}

Уделите минуту просмотру обновленного кода.

Изменив три части оператора for, мы изменили его поведение.

  • Мы инициализируем переменную i равной 10.
  • Мы изменим условие завершения, чтобы выйти из оператора for, когда i будет меньше 0.
  • Мы изменим шаблон итератора, чтобы вычитать 1 из i каждый раз, когда мы завершаем итерацию.
  1. Сохраните файл с кодом, а затем используйте Visual Studio для выполнения кода
  2. Заметьте, что вывод изменился. Когда вы запустите код, вы увидите следующий вывод.
10
9
8
7
6
5
4
3
2
1
0

Экспериментируйте с шаблоном итератора

Что, если мы хотим пропустить определенные значения в переменной итератора?

  1. С помощью редактора кода Visual Studio обновите код следующим образом:
for (int i = 0; i < 10; i += 3)
{
Console.WriteLine(i);
}
  1. Уделите минуту просмотру обновленного кода.

Вместо того чтобы увеличивать или уменьшать значение переменной итератора на 1, мы используем i += 3, чтобы пропускать два значения после каждой итерации. 3. Сохраните файл с кодом, а затем используйте Visual Studio для запуска кода. 4. Обратите внимание, как изменился вывод.

При выполнении кода вы увидите следующий вывод.

0
3
6
9

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

Используйте ключевое слово break, чтобы прервать выполнение итерационного оператора

Что делать, если нам нужно преждевременно завершить выполнение оператора итерации по какому-то условию? Мы можем использовать ключевое слово break.

  1. С помощью редактора кода Visual Studio обновите код следующим образом:
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
if (i == 7) break;
}
  1. Уделите минутку использованию ключевого слова break в вашем обновленном коде.

    Впервые мы познакомились с ключевым словом break в модуле «Разветвление потока кода с помощью конструкции switch-case в C#». Оказывается, ключевое слово break можно использовать и для выхода из итерационных операторов.

  2. Сохраните файл с кодом, а затем используйте Visual Studio для запуска кода.

  3. Обратите внимание, как изменился вывод.

    При выполнении кода вы увидите следующий вывод.

0
1
2
3
4
5
6
7

Пройдитесь по каждому элементу массива

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

  1. С помощью редактора кода Visual Studio обновите код следующим образом:
string[] names = { "Alex", "Eddie", "David", "Michael" };
for (int i = names.Length - 1; i >= 0; i--)
{
Console.WriteLine(names[i]);
}
  1. Уделите минуту просмотру обновленного кода.

Во-первых, обратите внимание, что мы инстанцировали строковый массив names, содержащий четыре имени.

Далее обратите внимание, что мы используем свойство Array.Length, чтобы получить количество элементов в массиве, и что мы используем это значение для инициализации нашей переменной-итератора (int i = names.Length - 1). Мы вычитаем 1 из этого значения, потому что индексные номера элементов массива основаны на нулях (индексные номера четырех элементов - 0-3).

Наконец, обратите внимание, что мы выбрали итерацию по массиву в обратном направлении - то, что мы не можем сделать с помощью оператора foreach. Мы используем значение переменной iteration внутри блока кода, чтобы указать номер индекса элементов массива (names[i]).

  1. Сохраните файл кода и запустите его с помощью Visual Studio.

  2. Обратите внимание, что элементы массива перечислены в обратном порядке (как мы и предполагали). Когда вы запустите код, вы увидите следующий результат.

Michael
David
Eddie
Alex
примечание

Мы могли бы итерироваться вперед по элементам массива, построив оператор for следующим образом: for (int i = 0; i < names.Length; i++).

Изучите ограничения оператора foreach

Что делать, если вы хотите обновить значение в массиве во время итерации foreach?

  1. С помощью редактора кода Visual Studio обновите код следующим образом:
string[] names = { "Alex", "Eddie", "David", "Michael" };
foreach (var name in names)
{
// Can't do this:
if (name == "David") name = "Sammy";
}
  1. Сохраните файл с кодом, а затем используйте Visual Studio для выполнения кода
  2. Обратите внимание на сообщение об ошибке, которое выводится на экран.

Если вы попытаетесь скомпилировать и запустить этот код, вы увидите исключение.

Cannot assign to name because it is a 'foreach iteration variable'

Другими словами, вы не можете переназначить значение name, потому что оно является частью внутренней реализации итерации foreach.

Преодоление ограничений оператора foreach с помощью оператора for

Давайте попробуем использовать оператор for для изменения содержимого массива внутри блока кода итерации.

  1. С помощью редактора кода Visual Studio обновите код следующим образом:
string[] names = { "Alex", "Eddie", "David", "Michael" };
for (int i = 0; i < names.Length; i++)
if (names[i] == "David") names[i] = "Sammy";

foreach (var name in names) Console.WriteLine(name);
  1. Уделите минуту просмотру обновленного кода.

Обратите внимание, что мы удалили фигурные скобки из блоков кода, которые содержали только одну строку кода. В этой правке использована та же техника, о которой мы говорили в модуле «Управление областью действия переменных и логикой с помощью блоков кода в C#». Многие разработчики считают такой стиль трудным для чтения, в то время как другие предпочитают сокращенный стиль, поскольку он помогает им писать более кратко и выразительно. Если вам трудно читать этот код или вы просто не любите этот стиль, будьте уверены, что фигурные скобки всегда можно использовать в ваших блоках кода. Если хотите, обновите код на панели редактора следующим кодом:

string[] names = { "Alex", "Eddie", "David", "Michael" };

for (int i = 0; i < names.Length; i++)
{
if (names[i] == "David")
{
names[i] = "Sammy";
}
}

foreach (var name in names)
{
Console.WriteLine(name);
}
  1. Сохраните файл с кодом, а затем используйте Visual Studio для запуска кода.
  2. Обратите внимание, что код выполняется без ошибок и выдает нужный результат.

Когда вы запустите код, вы увидите следующий результат.

Alex
Eddie
Sammy
Michael

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

Обзор

Вот несколько выводов из этого раздела:

  • Оператор for iteration позволяет выполнять итерации в блоке кода определенное количество раз.
  • Оператор for позволяет контролировать каждый аспект механики итерации, изменяя три условия внутри круглых скобок: инициализатор, условие и итератор.
  • Оператор for часто используется, когда вам нужно контролировать процесс итерации каждого элемента массива.
  • Если ваш блок кода состоит только из одной строки, вы можете исключить фигурные скобки и пробелы, если хотите.