Оператор foreach применяется для перебора элементов в специальным образом организованной группе данных. Массив является именно такой группой. Удобство этого вида цикла заключается в том, что нам не требуется определять количество элементов в группе и выполнять их перебор по индексу: мы просто указываем на необходимость перебрать все элементы группы.
Синтаксис оператора:
foreach (тип имя in выражение)
тело_цикла
Имя задает локальную по отношению к циклу переменную, которая будет по очереди принимать все значения из массива выражение (в качестве выражения чаще всего применяется имя массива или другой группы данных). В простом или составном операторе, представляющем собой тело цикла, выполняются действия с переменной цикла. Тип переменной должен соответствовать типу элемента массива.
Например, пусть задан массив:
int[] а = {24, 50, 18, 3, 16, -7, 9, -1 };
Вывод этого массива на экран с помощью оператора foreach выглядит следующим образом:
foreach (int x in a) Console.WriteLine(x);
Этот оператор выполняется так: на каждом проходе цикла очередной элемент массива присваивается переменной х и с ней производятся действия, записанные в теле цикла.
|
|
Ступенчатый массив из листинга 6.4 вывести на экран с помощью оператора foreach немного сложнее, чем одномерный, но все же проще, чем с помощью цикла for:
foreach (int[] x in a)
{
foreach (int у in x)
Console.Write("\t" + у);
Console.WriteLine();
}
В листинге 6.5 решается та же задача, что и в листинге 6.1, но с использованием цикла foreach. Обратите внимание на то, насколько понятнее стала программа.
Листинг 6.5. Работа с одномерным массивом с использованием цикла foreach
using System;
namespace ConsoleApplication1
{
class Class1
{
static void Main()
{
int[] a = { 3, 12, 5, -9, 8, -4 };
Console.WriteLine("Исходный массив:");
foreach (int elem in a)
Console.Write("\t" + elem);
Console.WriteLine();
long sum =0; // сумма отрицательных элементов
int num =0; // количество отрицательных элементов
foreach (int elem in a) if (elem < 0)
{
sum += elem;
++num;
}
Console.WriteLine("sum = " + sum);
Console.WriteLine("num = " + num);
int max = a[0]; // максимальный элемент
foreach (int elem in a)
if (elem > max) max = elem;
Console.WriteLine("max = " + max);
}
}
}
А вот как можно переписать метод вывода массива из листинга 6.3:
public static void PrintArray(string header, Array a)
{
Console.WriteLine(header);
foreach (object x in a)
Console.Write("\t" + x);
Console.WriteLine();
}
Такая запись становится возможной потому, что любой объект может быть неявно преобразован к типу его базового класса, а тип object, как вы помните, является корневым классом всей иерархии. Когда вы продвинетесь в изучении С# до раздела «Виртуальные методы» (см. с. 178), вы поймете механизм выполнения этого кода, а пока можете просто им пользоваться.
ВНИМАНИЕ
Ограничением оператора foreach является то, что с его помощью можно только просматривать значения в группе данных, но не изменять их.