Программирование на языке C#
Download 1.19 Mb. Pdf ko'rish
|
Программирование на языке C#
9.5.
Оператор foreach Оператор foreach применяется для перебора элементов массива, а также элементов в перечислимых коллекциях. 60 Синтаксис оператора имеет следующий вид: foreach ( тип имя in имя_массива ) тело_цикла; Имя задает локальную по отношению к циклу переменную, которая будет по очереди принимать все значения из массива. В одномерных массивах элементы просматриваются в порядке возрастания индекса начиная с 0. Рассмотрим работу с оператором foreach на примере ( листинг 14), в котором организуем вывод всех элементов массива на экран. int[] massiv = { 24, 50, 18, 3, 16, -7}; foreach ( int elem in massiv ) Console.WriteLine( elem ); Листинг 14. Наглядно работу оператора можно представить следующим образом (Pис. 10.). Определяется переменная elem, тип которой совпадает с типом значений ячеек массива massiv . Как показано на рисунке, в начальный момент времени переменная elem ( Рис. 10.) принимает значение первой ячейки, а на следующей итерации, переменная elem примет значение следующей ячейки и т.д. пока не закончится массив. massiv elem 24 50 18 3 16 -7 int int int int int int in massive) foreach( int Рис. 10. Схема работы оператора foreach Заметим, что при работе с оператором требуется следить за тем, чтобы ссылки не были пустыми. Например, если в листинге 14 рассмотреть случай, когда int[] massiv=null , то в переменную elem не будет записано начальное значение, после чего будет сгенерировано исключение System.NullReferenceException . В следующем примере определим количество отрицательных элементов и их сумму, также найдем максимальный элемент массива. Для решения этой задачи, достаточно организовать один проход по циклу с помощью оператора foreach . В переменную sum будем накапливать сумму отрицательных элементов массива, в переменной num их количество. Решение организуем с помощью условного оператора, в котором будем выполнять проверку на отрицательность текущего элемента массива elem . В случае, если текущий элемент отрицательный, то суммируем его с переменной sum , а также увеличиваем значение 61 переменной num на 1 . В переменной max сохраним максимальное значение массива, с этой целью, до начала итерации, необходимо инициализировать эту переменную некоторым эталонным значением, относительно которого будем определять максимум. Как правило, в качестве начального эталонного элемента разумно выбрать, например, первый элемент массива. То есть, предположим, что первый элемент является максимальным, далее, выполняя поэлементное сравнение текущего элемента с максимальным значением. Обновление значения переменной max будет происходить в том случае, если текущий элемент массива больше max . Следовательно, после просмотра всех элементов, в переменной max будет сохранено максимальное значение. Пример реализации представлен в листинге 15. int []Mx = {11,-2,31,-4,51,-61,17,18,99,-110}; long sum = 0;//сумма отрицательных элементов; int num = 0;// количество отрицательных элементов; int max = Mx[0];//максимальный элемент; foreach ( int elem in Mx ){ if ( elem < 0 ) { sum += elem; num++; } if (elem > max) max = elem; } foreach ( int elem in Mx ){ Console.Write("\t"+ elem); } Листинг 15. В случае многомерного массива, массив воспринимается как одномерный длинный массив, в котором строки расположены последовательно друг за другом. Например, рассмотрим вывод элементов на экран двумерного массива, состоящего из трёх строк и трёх столбцов. Массив int [,] Mx = {{1,2,3},{4,5,6},{7,8,9}}; будет восприниматься как последовательность элементов – {1, 2, 3, 4, 5, 6, 7, 8, 9} . обход элементов, с помощью оператора foreach , будет реализован следующим образом: foreach ( int i in Mx) System.Console.Write("{0} ", i); 62 В случае ступенчатых массивов при обходе элементов с помощью оператора foreach учитывается вся иерархия структуры. Например, рассмотрим ступенчатый массив типа int[][] arrA – массив массивов. Процедура обхода является такой же многоступенчатой, как и создание такого массива, то есть сначала выполняем обход по массиву, элементы которого являются ссылками на массив, далее выполняем обход для каждой ссылки. С этой целью организуем обход с помощью оператора foreach по уровням. На первом уровне идем по массиву ссылок, элемент для оператора foreach обозначим levelA , его тип int[]. На втором уровне (вложенный foreach ) идем по массиву levelA, где каждый элемент является конкретным значением int elem . Реализация представлена в листинге 16. int[][] arrA = new int[3][]; arrA[0] = new int[5] { 1, 2, 3, 4, 5 }; arrA[1] = new int[3] { 1, 2, 3 }; arrA[2] = new int[4] { 1, 2, 3, 4}; foreach (int[] levelA in arrA){ foreach (int elem in levelA) Console.Write("\t"+ elem); Console.WriteLine(); } Листинг 16. В следующем примере рассмотрим более сложную конструкцию. Определяем массив размерности szA прямоугольных массивов размерности szB , элементами которых являются одномерные массивы размерности szC . Создание и инициализация такой конструкции представлена в листинге 17. int[][,][] arrX = null; int szA, szB, szC; szA = 3; szB = 2; szC = 3; //Создание массива по первой размерности arrX = new int [szA][,][]; Random rnd = new Random(); for (int i = 0; i < szA; i++) { arrX[i] = new int[szB,szB][]; 63 } for(int i=0; i < szA; i++) { for(int j = 0; j < szB; j++) { for(int k = 0; k < szB; k++) { arrX[ix] [j, k] = new int[szC]; for(int z = 0; z < szC; z++) { arrX[i] [j, k] [z] = rnd.Next (1, 10); } } } } Листинг 17. Далее, реализуем обход данной структуры, с выводом всех элементов на экран. Для организации обхода необходимо использовать три вложенных оператора foreach . На первом уровне идем по массиву с элементами типа int[,][] levelA . На втором уровне перебираем элементы в двумерном массиве levelA , являющиеся ссылкой на одномерный массив int[] levelB . На последнем уровне в массиве levelB перебираем конкретные значения, которые обозначим int value . Реализация обхода предложенной структуры реализована в листинге 18. foreach(int[,][] levelA in arrX){ foreach(int[]levelB in levelA){ foreach (int value in levelB) { Console.Write ("\t"+value); } Console.WriteLine (); } } } Листинг 18. Заметим, что вариант обхода с использованием оператора foreach , представляет собой более компактный код, нежели код с использованием оператора for . Download 1.19 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling