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

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

Класс Array

Для более детального понимания особенностей использования массивов в C# необходимо рассмотреть специализированный класс, реализующий функции массива. Как уже упоминалось ранее, все типы данных в C# являются классами, для которых в качестве базового выступает класс Object. Класс Array - не исключение. Он реализует все базовые свойства классов и является предком для всех типов массивов, к которым мы привыкли в языке C++ и синтаксис описания которых был приведен выше. То, что класс Array является потомком класса Object, кажется на первый взгляд малоинтересным фактом, однако на самом деле говорит о многом. В частности, благодаря этому в классе Array оказывается определено множество разнообразных операций, таких как копирование, поиск, обращение, сортировки и т. д.

Ниже приведены наиболее интересные методы класса Array

BinarySearch() Поиск элементов в одномерном отсортированном массиве.
Sort() Сортировка элементов одномерного массива.
Clear() Очистка элементов массива в заданном диапазоне индексов.
CopyTo() Копирование элементов исходного массива в массив назначения.
GetLength(), Length Определение количества элементов в указанном измерении массива.
GetLowerBound() Определение нижней границы массива.
GetUpperBound() Определение верхней границы массива.
GetValue() Возвращает значение указанного индекса для массива.
SetValue() Устанавливает значение указанного индекса для массива.
Reverse() Расставляет элементы одномерного массива в обратном порядке.
Rank Определение количества измерений указанного массива.

Рассмотрим пример использования класса Array. Для этого создадим массив и обеспечим возможность поиска в нем элементов.

Объявим массив myArray как статический член класса Page, состоящий из шести элементов типа int:

static Array myArray = Array.CreateInstance(typeof(Int32), 6);

Разместим на форме элементы TextBox и Button, которым присвоим имена tb_value и btn_find соответственно, как показано на рис. 3.3.

Размещение на форме элементов TextBox и Button

Рис. 3.3. Размещение на форме элементов TextBox и Button

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

protected void btn_find_Click(object sender, EventArgs e)
{
  Random rnd = new Random();
  Response.Write("Исходный массив <br/>");
  for (int i = myArray.GetLowerBound(0); i <=
  myArray.GetUpperBound(0); i++)
  {
    myArray.SetValue(rnd.Next(1, 10), i);
    Response.Write(myArray.GetValue(i) + "\t");
  }
  Response.Write("<br/>");
  Array.Sort(myArray);
  Response.Write("После сортировки:<br/>");
  for (int i = myArray.GetLowerBound(0); i <=
  myArray.GetUpperBound(0); i++)
  {
    Response.Write(myArray.GetValue(i) + "\t");
  }
  object o = Convert.ToInt32(tb_value.Text);
  int findIndex = Array.BinarySearch(myArray, o);
  if (findIndex<0)
  {
    Response.Write("<br/>Элемент не найден");
  }
  else
  {
    Response.Write("<br/>Элемент найден в позиции <b>"+findIndex.
    ToString()+"</b>");
  }
}

Пример работы программы в результате выполнения приведенного выше кода представлен на рис. 3.4.

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

Рис. 3.4. Результат работы программы заполнения, сортировки и поиска элементов массива

Как видно, работать с массивами в C# достаточно просто, в особенности учитывая довольно большие возможности класса Array.

Перечисления

При работе с современными языками программирования можно заметить, что часто вместо цифровых констант и значений используются имена. Так происходит, например, при указании цвета того или иного элемента управления либо объекта. Обычно цвет задается в виде кодов, соответствующих интенсивности каждой его составляющей: красного, зеленого, синего цвета; однако это неудобно, т. к. не является наглядным представлением получаемого в результате цвета. Для решения задачи упрощения использования цветов применяется именованная совокупность цветов, сопоставляющая код с наименованием. Это дает возможность в программном коде использовать имена наиболее часто употребляемых цветов. Например, цвет текста, выводимого на экран с помощью элемента Label, можно задать с помощью команды

Label1.ForeColor=Color.Red;

В данном случае имя Red соответствует красному цвету из набора цветов Colors. Такие наборы называются перечислениями.

Перечисление можно создать следующим образом:

enum OrganizationType
{
  Education,
  Trade,
  Manufacture,
  Services
}

Перечисление OrganizationType определяет четыре именованные константы, каждой из которых соответствует определенное числовое значение. По умолчанию первому элементу перечисления соответствует значение 0, второму - 1, третьему - 2 и т. д.

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

enum OrganizationType
{
  Education=10,
  Trade,
  Manufacture,
  Services
}

Номера, присваиваемые переменным, не обязательно должны идти последовательно. Они могут быть расположены в произвольном порядке.

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

enum OrganizationType:byte
{
  Education,
  Trade,
  Manufacture,
  Services
}

Все перечисления в C# происходят от единого базового класса System.Enum. Этот класс содержит методы, существенно облегчающие работу с перечислениями. Так, статический метод GetUnderlyingType() позволяет получить информацию о том, какой тип данных используется для представления числовых значений элементов перечисления.

Например, следующая строка выведет на экран System.Byte, соответствующий типу элементов перечисления OrganizationType:

Response.Write(Enum.GetUnderlyingType(typeof(OrganizationType)));

Enum позволяет получить значимые имена элементов перечисления по их числовым значениям. Для этого используется статический метод Format(). Следующий пример выведет на экран наименование элемента перечисления OrganizationType, которому соответствует значение 2 (в данном случае — Manufacture ):

Response.Write(Enum.Format(typeof(OrganizationType),(byte)2,"G"));

Параметр "G", указанный в функции Format, задает режим вывода строки результата. G означает, что результат будет выводиться в виде строки. Возможны еще два параметра форматирования. X - шестнадцатеричное представление результата, d - десятичное значение.

В классе System.Enum существует также метод, позволяющий создать массив на основе указанного перечисления. Например, следующая строка создает массив а, состоящий из 4 элементов. В первый элемент будет записано значение Education, во второе - Trade и т. д.

Array a = Enum.GetValues(typeof(OrganizationType));

Если нужно определить, является ли символьная строка элементом перечисления, необходимо использовать свойство IsDefined класса Enum. Следующие примеры демонстрируют применение этого свойства. В первом случае результат проверки будет положительным, во втором - отрицательным:

bool r = Enum.IsDefined(typeof(OrganizationType), "Trade");
bool r1 = Enum.IsDefined(typeof(OrganizationType), "Entertainment");