Шаг 55.
Язык программирования C#. Начала
Массивы. Цикл по массиву

    На этом шаге мы рассмотрим еще одну конструкцию цикла.

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

foreach (тип переменная in массив) {
  // Команды
}

    В круглых скобках после ключевого слова foreach объявляется локальная переменная. Она доступна только в теле цикла. При объявлении переменной указывается ее тип и название. После имени переменной указывается ключевое слово in и название массива, элементы которого перебираются в процессе выполнения цикла. Команды, выполняемые за каждый цикл, указываются в фигурных скобках после foreach-инструкции. Конструкция выполняется следующим образом. Объявленная в foreach-инструкции переменная последовательно принимает значения элементов массива, указанного после ключевого слова in. Таким образом, в отличие от "классической" циклической конструкции for, где элементы массива перебираются с помощью индексной переменной, в данном случае перебираются не индексы элементов, а сами элементы.


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

    Небольшой пример использования этой конструкции приведен ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace pr55_1
{
    class Program
    {
        static void Main()
        {
            // Целочисленный массив: 
            int[] nums = {1, 3, 4, 8, 9};
            // Символьный массив:
            char[] symbs = {'a', 'b', 'A', 'B', 'Ы'};
            // Текстовый массив:
            String[] txts = {"красный", "желтый", "синий"};
            Console.WriteLine("Целочисленный массив") ;
            // Циклы по целочисленному массиву: 
            foreach(int s in nums){
                Console.WriteLine("Число {0} - {1}", s, s % 2==0 ? "четное" : 
                              "нечетное");
            }
            Console.WriteLine("Символьный массив");
            // Цикл по символьному массиву: 
            foreach(char s in symbs) {
                Console.WriteLine("Код символа {0} - {1}", s, (int)s);
            }
            Console.WriteLine("Текстовый массив");
            // Цикл по текстовому массиву: 
            foreach(string s in txts){
                Console.WriteLine("В слове \"{0}\" {1} букв", s, s.Length);
            }
            // Задержка:
            Console.ReadLine();
        }
    }
}
Архив проекта можно взять здесь.

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


Рис.1. Результат работы приложения

    В программе создается три массива:

Содержимое каждого из этих массивов отображается в консольном окне. Для перебора элементов в массивах используется конструкция цикла foreach. В программе таких циклов три (но количеству массивов). В каждом из них использована локальная переменная для перебора элементов массива. Хотя во всехконструкциях цикла название у локальной переменной s, но это разные переменные и объявлены они с разными идентификаторами типов. Тип локальной переменной определяется типом элементов массива. Поэтому в первой конструкции цикла переменная s объявлена с идентификатором типа int, во второй конструкции цикла локальная переменная объявлена с идентификатором типа char, а в третьей конструкции цикла переменная объявлена с идентификатором типа string. Соответственно, в первой конструкции цикла переменная s обрабатывается как целочисленное значение, во второй конструкции цикла переменная s обрабатывается как символьное значение, а в третьей конструкции цикла переменная s обрабатывается как текстовое значение. В первой конструкции цикла переменная s последовательно принимает значения элементов из массива nums. За каждый цикл командой
  Console.WriteLine("Число {0} - {1}", s, s % 2==0 ? "четное" : "нечетное");
отображается сообщение, в котором указано значение числа и отображен тот факт, четное число или нечетное. В частности, при отображении текстовой строки "Число {0} {1}" вместо инструкции {0} подставляется значение переменной s (значение очередного элемента массива nums), a вместо инструкции {1} подставляется значение выражения
  s % 2==0 ? "четное" : "нечетное"   .

    В выражении использован тернарный оператор. Значением выражения является текст "четное", если истинно условие s%2==0 (остаток отделения на 2 значения элемента массива равен нулю). Если условие s%2==0 ложно, то значением выражения

  s % 2==0 ? "четное" : "нечетное"   .
является текст "нечетное".

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

  Console.WriteLine("Код символа {0} - {1}", s, (int)s);     .
Вместо инструкции {0} подставляется значение элемента массива (оно же значение переменной s), а вместо инструкции {1} подставляется код этого символа. Код символа вычисляется инструкцией (int)s. Здесь имеет место явное приведение символьного значения переменной s к целочисленному формату. Результатом является код соответствующего символа в используемой кодовой таблице.

    В третьей конструкции цикла переменная s принимает значения элементов из текстового массива txts. Для каждого элемента массива вычисляется количество символов в тексте. Для этого использована инструкция s.Length. Текстовое значение элемента и количество символов в тексте отображаются с помощью команды

  Console.WriteLine("В слове \"{0}\" {1} букв", s, s.Length);    .
в теле цикла.

    При отображении текстового сообщения командой

  Console.WriteLine("В слове \"{0}\" {1} букв", s, s.Length);    .
мы заключаем значение элемента в двойные кавычки. Другими словами, в текстовый литерал нам необходимо включить двойные кавычки (как символ). В таком случае (то есть для вставки в текстовый литерал двойных кавычек) используется инструкция \", содержащая перед двойной кавычкой " обратную косую черту \.

    На следующем шаге мы рассмотрим двумерные массивы.




Предыдущий шаг Содержание Следующий шаг