Опубликован: 25.09.2008 | Доступ: свободный | Студентов: 3223 / 516 | Оценка: 4.32 / 3.98 | Длительность: 18:50:00
ISBN: 978-5-94774-991-5
Лекция 3:

Основы языка C#

Массивы, перечисления, коллекции

Массивы

Массивы в C# с точки зрения синтаксиса практически ничем не отличаются от массивов в языке C++ и Java. Тем не менее внутреннее устройство массивов C# сильно отличается от упомянутых языков. Дело в том, что любой массив в C# является потомком класса System.Array со всеми вытекающими последствиями, связанными с наследованием каждым массивом свойств и методов класса Array. Более подробно класс Array рассматривается ниже.

Формально массив можно определить как набор однотипных элементов, доступ к которым производится с помощью числового индекса. Элементами массива могут быть значения произвольного типа, в том числе массивы, классы, структуры и интерфейсы. Массивы могут быть как одномерными, так и многомерными. Объявление массива происходит путем помещения квадратных скобок после указания типа данных для элемента массива.

Рассмотрим пример: создание массива d, состоящего из десяти элементов типа int. При этом необходимо учитывать тот факт, что нумерация элементов начинается с нуля. Т. е. в данном случае массив будет состоять из десяти элементов с номерами {0…9}:

int[] d;
d = new int[10];

Аналогичное предыдущему действие, требующее всего одной строки кода:

int[] d = new int[10];

Еще один пример создания массива, состоящего из двенадцати элементов типа string:

string[] st = new string[12];

При создании массивов необходимо учитывать, что для создания массива фиксированной длины, как в предыдущих примерах, необходимо всегда использовать ключевое слово new. Таким образом, следующее определение массива недопустимо и приведет к возникновению ошибки еще на этапе компиляции:

int[3] a={3,5,6};

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

int[] a={3,5,6};

Заполнение массивов возможно осуществлять аналогично C++, с использованием фигурных скобок, как уже было показано выше, либо обращаясь к элементам массива по номерам элементов:

int[] a=new int[3]{3,5,6};

   int[] a = new int[3];
   a[0] = 3;
   a[1] = 5;
   a[2] = 6;

Важным отличием массивов C# от C++ является то, что при создании массива в C# его элементам автоматически присваиваются значения по умолчанию, в отличие от C++, где значения элементов только что созданного массива оказываются не определены. Присваиваемые значения по умолчанию зависят от типа элемента. Так, для объектов значением по умолчанию является NULL, а для целых чисел - 0.

Помимо простых одномерных массивов C# поддерживает также многомерные массивы, которые в свою очередь делятся на две категории. К первой категории относятся массивы, количество элементов каждой строки которых состоит из одинакового количества элементов. Таким образом, массив можно рассматривать как прямоугольник, а сами такие массивы называют "прямоугольными". Ко второй категории относятся массивы, количество элементов в строках у которых не одинаково. Такие массивы образуют прямоугольник, у которого одна сторона представляет ломаную линию, поэтому такие массивы называют "ломаными".

Рассмотрим простейшие манипуляции для работы с прямоугольными многомерными массивами.

Объявление и заполнение массива производится стандартным способом: для этого организуется два цикла:

Random rnd=new Random();
int[,] Matrix;
Matrix = new int[5, 4];
for (int i = 0; i < 5; i++)
  for (int j=0;j<4;j++)
    Matrix[i,j] = rnd.Next(10,99);

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

for (int i = 0; i < 5; i++)
{
  for (int j = 0; j < 4; j++)
  {
    Response.Write(Matrix[i, j].ToString());
    Response.Write(" ");
  }
  Response.Write("<br/>");
}

Результат работы программы показан на рис. 3.1.

Результат работы программы с "прямоугольным" массивом

Рис. 3.1. Результат работы программы с "прямоугольным" массивом

"Ломаный" массив может рассматриваться как массив, каждая ячейка которого представляет собой массив. В качестве примера создадим массив с переменным количеством элементов в строках:

Random rnd = new Random();
int[][] JMatrix = new int[5][];
for (int i = 0; i < JMatrix.Length; i++)
{
  JMatrix[i] = new int[rnd.Next(1,7)];
}

Количество элементов в строке определяется случайным образом в момент формирования массива. Количество строк задано жестко и равно пяти. Массив не заполняется никакими числами, поэтому на экран будут выводиться значения, которыми заполняется массив по умолчанию (в данном случае это ноль).

Для вывода информации на экран необходимо использовать два цикла, как это показано ниже.

for (int i = 0; i < JMatrix.Length; i++)
{
  Response.Write("Количество элементов в строке " +
   i.ToString() + "=" + JMatrix[i].Length.ToString()+" ");
  for (int j = 0; j < JMatrix[i].Length; j++)
  {
    Response.Write(JMatrix[i][j].ToString() + " ");
  }
  Response.Write("<br/>");
}

В цикле по j происходит определение количества элементов в строке с помощью свойства Length.

Результат работы программы представлен на рис. 3.2.

Результат вывода на экран содержимого "ломаного" массива

Рис. 3.2. Результат вывода на экран содержимого "ломаного" массива