other);
void IntersectWith(IEnumerable other);
bool IsProperSubsetOf(IEnumerable other);
bool IsProperSupersetOf(IEnumerable other);
bool IsSubsetOf(IEnumerable other);
bool IsSupersetOf(IEnumerable other);
bool Overlaps(IEnumerable other);
bool SetEquals(IEnumerable other);
void SymmetricExceptWith(IEnumerable other);
void UnionWith(IEnumerable other);
}
2.9. МАССИВЫ И КЛАСС SYSTEM.ARRAY
Класс System.Array является базовым классом для любого массива. Язык C# поддерживает особый синтаксис объявления и инициализации массивов, но CLR на основе этого синтаксиса порождает класс, унаследованный от Array.
Любой массив реализует интерфейсы IList и IList, причём 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); // смещение задано в байтах!