Модуль №1
Else
Цикл работает в полном соответствии со своим названием - тело цикла выполняется для каждого элемента в контейнере. Тип идентификатора должен быть согласован с типом элементов, хранящихся в контейнере данных. Предполагается также, что элементы контейнера (массива, коллекции) упорядочены. На каждом шаге цикла идентификатор, задающий текущий элемент контейнера, получает значение очередного элемента в соответствии с порядком, установленным на элементах контейнера. С этим текущим элементом и выполняется тело цикла - выполняется столько раз, сколько элементов находится в контейнере. Цикл заканчивается, когда полностью перебраны все элементы контейнера.
Foreach(тип идентификатор in контейнер) оператор
Цикл foreach
Новым видом цикла, не унаследованным от С++, является цикл foreach, удобный при работе с массивами, коллекциями и другими подобными контейнерами данных. Его синтаксис:
Серьезным недостатком циклов 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
Базовый класс System.Array
Все классы-массивы являются потомками класса Array из библиотеки FCL (статическом компоненте Framework .Net.) Помимо наследования свойств и методов класса Object и вышеперечисленных интерфейсов, класс Array имеет довольно большое число собственных методов и свойств. Благодаря такому мощному родителю, над массивами определены самые разнообразные операции - копирование, поиск, обращение, сортировка, получение различных характеристик. Массивы можно рассматривать как коллекции и устраивать циклы foreach для перебора всех элементов.
Таблица 1.3 - Свойства класса Array
Свойство | Родитель | Описание |
IsFixedSize | Интерфейс IList | True, если массив статический |
Length | Число элементов массива | |
Rank | Размерность массива |
Таблица 1.4 - Статические методы класса Array
Метод | Описание |
BinarySearch() | Двоичный поиск. |
Clear() | Выполняет начальную инициализацию элементов. В зависимости от типа элементов устанавливает значение 0 для арифметического типа, false - для логического типа, Null для ссылок, "" - для строк. |
CopyTo() | Копирование части или всего массива в другой массив. Описание и примеры даны в тексте |
GetLength() | Используется для определения количества элементов в указанном измерении массива |
IndexOf() | Индекс первого вхождения образца в массив. Описание и примеры даны в тексте |
LastIndexOf() | Индекс последнего вхождения образца в массив. Описание и примеры даны в тексте |
Reverse() | Обращение одномерного массива. |
Sort() | Сортировка одномерного массива встроенных типов данных. |
GetValue() SetValue() | Возвращает или устанавливает значение указанного индекса для массива. |
GetUpperBound() GetLowerBound() | Используется для определения нижней или верхней границы выбранного измерения массива. |
// Программа 1.Применение методов класса Array
public static int Main(string[] args) {
string[]firstNames={"Саша", "Маша", "Олег", "Света", "Игорь"};
Console.WriteLine("Here is the array:");
for(int i=0; i< firstNames.Length; i++)
Console.WriteLine(firstNames[i]+"\t");
Console.WriteLine("\n");
Array.Reverse(firstNames);
for(int i=0; i< firstNames.Length; i++)
Console.WriteLine(firstNames[i]+"\t");
Console.WriteLine("\n");
Console.WriteLine("Cleared out all but one…");
Array.Clear(firstNames,1,4);
for(int i=0; i< firstNames.Length; i++)
Console.WriteLine(firstNames[i]+"\t\n");
return 0;
}
В следующей процедуре, формальный аргумент которой будет принадлежать родителю всех классов-массивов, можно передавать массив любого класса в качестве фактического аргумента:
// Программа 2.Применение методов класса Array
public static void PrintAr(string name, Array A) {
Console.WriteLine(name);
switch (A.Rank) {
case 1:
for(int i = 0; i<A.GetLength(0);i++)
Console.Write("\t" + name + "[{0}]={1}", i, A.GetValue(i));
Console.WriteLine();
break;
case 2:
for(int i = 0; i<A.GetLength(0);i++) {
for(int j = 0; j<A.GetLength(1);j++)
Console.Write("\t" + name + "[{0},{1}]={2}", i,j, A.GetValue(i,j));
Console.WriteLine();
}
break;
default: break;
}}
Примеры различных операций, доступных при работе с массивами, благодаря наследованию от класса Array:
// Программа 3.Применение методов класса Array
public void TestCollection() { //операции над массивами
int nc = 7;
int[] col1 = new int[nc], col2 = new int[nc];
double[] col3 = new double[nc];
int[,] col4 = new int[2,2];
CreateCollection(col1); //заполнение случайными числами
PrintCollection("col1",col1);
CreateCollection(col2);
PrintCollection("col2",col2);
CreateCollection(col3);
PrintCollection("col3",col3);
CreateTwoDimAr(col4);
PrintCollection("col4",col4);
// поиск элемента
int first = Array.IndexOf(col1, 2);
int last = Array.LastIndexOf(col1,2);
if (first == -1)
Console.WriteLine("Нет вхождений 2 в массив col1");
else if (first ==last)
Console.WriteLine("Одно вхождение 2 в массив col1");
Console.WriteLine("Несколько вхождений 2 в массив col1");
//first = Array.IndexOf(col4, 4); только одномерный массив
Array.Reverse(col1);
Console.WriteLine("Обращение массива col1:");
PrintCollection("col1",col1);
//копирование
Array.Copy(col1, col3, col1.Length);
Console.WriteLine(" Массив col3 после копирования массива col1:");
PrintCollection("col3",col3);
Array.Copy(col1,1,col2,1,2);
Console.WriteLine("копирование двух элементов col1 в col2:");
PrintCollection("col1",col1);
PrintCollection("col2",col2);
//быстрая сортировка Хоара
Array.Sort(col1);
Console.WriteLine("Отсортированный массив col1:");
PrintCollection("col1",col1);
first = Array.BinarySearch(col1, 2);
Console.WriteLine("Индекс вхождения 2 в col1: {0}",first);
//Создание экземпляра (массива)
Array my2Dar = Array.CreateInstance(typeof(double), 2,3);
PrintCollection("my2Dar",my2Dar);
//клонирование
my2Dar = (Array)col4.Clone();
Console.WriteLine("Массив my2Dar после клонирования col4:");
PrintCollection("my2Dar",my2Dar);
//копирование CopyTo
col1.CopyTo(col2,0);
Console.WriteLine("Массив col2 после копирования col1:");
PrintCollection("col2",col2);
}
В этой процедуре продемонстрированы вызовы различных статических методов класса Array. Для метода Copy показан вызов двух реализаций этого метода, когда копируется весь массив и часть массива. Закомментированный оператор вызова метода IndexOf напоминает о невозможности использования методов поиска при работе с многомерными массивами.
Апаратне і програмне забезпечення
Персональної ЕОМ