Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базовые технологии платформы .NET.docx
Скачиваний:
13
Добавлен:
03.11.2018
Размер:
614.46 Кб
Скачать

9. Массивы и класс system.Array

Класс System.Array является базовым классом для любого массива. Язык C# поддерживает особый синтаксис объявления и инициализации массивов, но CLR на основе этого синтаксиса порождает класс, унаследованный от Array.

Любой массив реализует интерфейсы IList и IList<T>, причём IList реализован явно (так как методы Add() и Remove() генерируют исключение в случае коллекции фиксированной длины, которой является массив). В табл. 6 описаны экземплярные элементы любого массива, а табл. 7 содержит статические методы класса Array.

Таблица 6

Экземплярные элементы массива

Имя элемента

Описание

Rank

Свойство для чтения, возвращает размерность массива

Length

Свойство для чтения, возвращает общее число элементов массива

LongLength

Свойство для чтения ‑ число элементов. Имеет тип long

CopyTo()

Метод копирует фрагмент массива в другой массив

GetLength()

Метод возвращает число элементов в указанном измерении

GetLowerBound()

Метод возвращает нижнюю границу для указанного измерения

GetUpperBound()

Метод возвращает верхнюю границу для указанного измерения

GetValue()

Метод возвращает значение элемента с указанными индексами

SetValue()

Метод устанавливает значение элемента с указанными индексами

Таблица 7

Статические элементы класса System.Array

Имя метода

Описание

Sort()

Сортирует массив, переданный в качестве параметра (возможно, с применением собственного объекта для сравнения элементов)

BinarySearch()

Поиска элемента в отсортированном массиве

IndexOf()

Возвращает индекс первого вхождения своего аргумента в одномерный массив (фрагмент массива) или –1, если элемента в массиве нет

LastIndexOf()

Возвращает индекс последнего вхождения аргумента в одномерный массив (фрагмент массива) или –1, если элемента в массиве нет

Exists()

Определяет, содержит ли массив хотя бы один элемент, удовлетворяющий предикату, который задан параметром метода

Find()

Возвращает первый элемент, удовлетворяющий предикату, который задан параметром метода

FindLast()

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

FindAll()

Возвращает все элементы, удовлетворяющие предикату, который задан параметром метода

FindIndex()

Возвращает индекс первого вхождения элемента, удовлетворяющего предикату, заданному как параметр метода

FindLastIndex()

Возвращает индекс последнего вхождения элемента, удовлетворяющего предикату, заданному как параметр метода

ConvertAll()

Конвертирует массив одного типа в массив другого типа

ForEach()

Выполняет указанное действие для всех элементов массива

TrueForAll()

Возвращает true, если заданный предикат верен для всех элементов

Clear()

Устанавливает для массива или его части значение по умолчанию для типа элементов

Reverse()

Меняет порядок элементов в одномерном массиве или его части на противоположный

AsReadOnly()

Создаёт на основе массива коллекцию, не допускающую модификации своих элементов (read-only collection)

CreateInstance()

Создаёт экземпляр массива любого типа, размерности и длины

Copy()

Копирует раздел одного массива в другой массив, выполняя приведение типов

ConstrainedCopy()

Метод подобен Copy(), но если приведение типов для элементов неудачно, выполняется отмена операции копирования

Resize()

Позволяет изменить размер массива

Рассмотрим несколько примеров использования методов массива. В первом примере создадим массив и выполним работу с его элементами, не применяя традиционный синтаксис C#.

Array a = Array.CreateInstance(typeof(string), 2); // тип, длина

a.SetValue("hi", 0); // a[0] = "hi";

a.SetValue("there", 1); // a[1] = "there";

string s = (string)a.GetValue(0); // s = a[0];

Метод CreateInstance() может создать массив любой размерности с указанным диапазоном изменения индексов:

// b – это массив int[-5..4, 100..119]

Array b = Array.CreateInstance(typeof(int),

new[] {10, 20}, new[] {-5, 100});

b.SetValue(25, -3, 110);

int x = (int) b.GetValue(-2, 115);

Группа статических методов класса Array позволяет выполнить сортировку и поиск данных в массиве. Методы поиска могут использовать заданные предикаты, а сортировка – выполняться по заданному критерию сравнения.

int[] a = {10, 3, 5, -7, 0, 20, 10, 4}; // исходный массив

int b = Array.Find(a, x => x > 6); // поиск элемента по предикату

int[] c = Array.FindAll(a, x => x > 6); // поиск всех элементов

Array.ForEach(c, Console.WriteLine); // действие над элементами

bool flag = Array.TrueForAll(a, x => x > 0); // проверка условия

Array.Sort(a, (x, y) => x == y ? 0 : x > y ? -1 : 1); // сортировка

int pos = Array.BinarySearch(a, 3); // двоичный поиск

Массивы допускают копирование элементов и изменение размера:

int[] a = {10, 3, 5, -7, 0, 20, 10, 4};

int[] b = new int[a.Length];

long[] c = new long[a.Length];

a.CopyTo(b, 0);

Array.Copy(a, c, a.Length);

Array.Resize(ref a, 40);

Заметим, что для быстрого копирования массивов с элементами типа значений можно использовать класс System.Buffer, который оперирует байтами данных.

int[] a = {10, 3, 5, -7, 0, 20, 10, 4};

int[] b = new int[a.Length];

Buffer.BlockCopy(a, 3, b, 5, 10); // смещение задано в байтах!