Цикл foreach

 

Новым видом цикла, не унаследованным от С++, является цикл foreach, удобный при работе с массивами, коллекциями и другими подобными контейнерами данных. Его синтаксис:

 

foreach(тип идентификатор in контейнер) оператор

 

Цикл работает в полном соответствии со своим названием - тело цикла выполняется для каждого элемента в контейнере. Тип идентификатора должен быть согласован с типом элементов, хранящихся в контейнере данных. Предполагается также, что элементы контейнера (массива, коллекции) упорядочены. На каждом шаге цикла идентификатор, задающий текущий элемент контейнера, получает значение очередного элемента в соответствии с порядком, установленным на элементах контейнера. С этим текущим элементом и выполняется тело цикла - выполняется столько раз, сколько элементов находится в контейнере. Цикл заканчивается, когда полностью перебраны все элементы контейнера.

 

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

 

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

 

/// <summary>

/// Демонстрация цикла foreach. Вычисление суммы,

/// максимального и минимального элементов

/// трехмерного массива, заполненного случайными числами.

/// </summary>

public void SumMinMax()

{

int [,,] arr3d = new int[10,10,10];

Random rnd = new Random();

for (int i =0; i<10; i++)

for (int j =0; j<10; j++)

for (int k =0; k<10; k++)

arr3d[i,j,k]= rnd.Next(100);

long sum =0; int min=arr3d[0,0,0], max=arr3d[0,0,0];

foreach(int item in arr3d)

{

sum +=item;

if (item > max) max = item;

else if (item < min) min = item;

}

Console.WriteLine("sum = {0}, min = {1}, max = {2}",

sum, min, max);

}//SumMinMax