Ранее уже говорилось, что все массивы в С# построены на основе базового класса Array, который содержит полезные для программиста свойства и методы, часть из которых перечислены в табл. 6.1.
Таблица 6.1. Основные элементы класса Array
Элемент | Вид | Описание |
Length | Свойство | Количество элементов массива (по всем размерностям) |
Rank | Свойство | Количество размерностей массива |
BinarySearch | Статический метод | Двоичный поиск в отсортированном массиве |
Clear | Статический метод | Присваивание элементам массива значений по умолчанию |
Сору | Статический метод | Копирование заданного диапазона элементов одного массива в другой массив |
СоруТо | Метод | Копирование всех элементов текущего одномерного массива в другой одномерный массив |
GetValue | Метод | Получение значения элемента массива |
IndexOf | Статический метод | Поиск первого вхождения элемента в одномерный массив |
LastIndexOf | Статический метод | Поиск последнего вхождения элемента в одномерный массив |
Reverse | Статический метод | Изменение порядка следования элементов на обратный |
SetValue | Метод | Установка значения элемента массива |
Sort | Статический метод | Упорядочивание элементов одномерного массива |
Свойство Length позволяет реализовывать алгоритмы, которые будут работать с массивами различной длины или, например, со ступенчатым массивом. Использование этого свойства вместо явного задания размерности исключает возможность выхода индекса за границы массива. В листинге 6.3 продемонстрировано применение элементов класса Array при работе с одномерным массивом.
|
|
Листинг 6.3. Использование методов класса Array с одномерным массивом
using System;
namespace ConsoleApplication1
{
class Class1
{
static void Main()
{
int[] a = { 24, 50, 18, 3, 16, -7, 9, -1 };
PrintArray("Исходный массив:", а);
Console.WriteLine(Array.IndexOf(a, 18));
Array.Sort(a);
PrintArray("Упорядоченный массив:", а);
Console.WriteLine(Array.BinarySearch(a, 18));
}
public static void PrintArray(string header, int[] a)
{
Console.WriteLine(header);
for (int i = 0; i < a.Length; ++i)
Console.Write("\t" + a[i]);
Console.WriteLine();
}
}
}
Методы Sort, IndexOf и BinarySearch являются статическими, поэтому к ним обращаются через имя класса, а не экземпляра, и передают в них имя массива. Двоичный поиск можно применять только для упорядоченных массивов. Он выполняется гораздо быстрее, чем линейный поиск, реализованный в методе IndexOf. В листинге поиск элемента, имеющего значение 18, выполняется обоими этими способами.
ПРИМЕЧАНИЕ
Рассмотренные методы имеют по несколько версий (в этом случае употребляется термин «перегруженные методы»), что позволяет выполнять поиск, сортировку и копирование как в массиве целиком, как и в его указанном диапазоне.
В классе Class1 описан вспомогательный статический метод PrintArray, предназначенный для вывода массива на экран. В него передаются два параметра: строка заголовка header и массив. Количество элементов массива определяется внутри метода с помощью свойства Length. Таким образом, этот метод можно использовать для вывода любого целочисленного одномерного массива. Результат работы программы:
|
|
Исходный массив:
24 50 18 3 16 -7 9 -1 2
Упорядоченный массив:
-7 -1 3 9 16 18 24 50 5
Для того чтобы применять метод PrintArray к массивам, состоящим из элементов другого типа, можно описать его второй параметр как Array. Правда, при этом значение элемента массива придется получать с помощью метода GetValue, поскольку доступ по индексу для класса Array не предусмотрен. Обобщенный метод вывода массива выглядит так:
public static void PrintArray(string header, Array a)
{
Console.WriteLine(header);
for (int i = 0; i < a.Length; ++i)
Console.Write("\t" + a.GetValue(i));
Console.WriteLine();
}
В листинге 6.4 продемонстрировано применение элементов класса Array при работе со ступенчатым массивом.
Листинг 6.4. Использование методов класса Array со ступенчатым массивом
namespace ConsoleApplication1
{
class Class1
{
static void Main()
{
int[][] a = new int[3][];
a[0] = new int [5] { 24, 50, 18, 3, 16 };
a[l] = new int [3] { 7, 9, -1 };
a[2] = new int [4] { 6, 15, 3, 1 };
Console.WriteLine("Исходный массив:");
for (int i = 0; i < a.Length; ++i)
{
for (int j = 0; j < a[i].Length; ++j)
Console.Write("\t" + a[i][j]);
Console.WriteLine();
Console.WriteLine(Array.IndexOf(a[0],18));
}
}
}
}
Обратите внимание на то, как внутри цикла по строкам определяется длина каждого массива. Результат работы программы:
Исходный массив:
24 50 18 3 16
7 9-1
6 15 3 1