- •А.А. Волосевич
- •Содержание
- •1. Работа с числами
- •2. Представление даты и времени
- •3. Работа со строками и текстом
- •4. Преобразование информации
- •5. Сравнение для выяснения равенства
- •6. Сравнение для выяснения порядка
- •7. Жизненный цикл объектов
- •7.1. Алгоритм сборки мусора
- •7.2. Финализаторы и интерфейс iDisposable
- •7.3. Слабые ссылки
- •8. Перечислители и итераторы
- •9. Стандартные интерфейсы коллекций
- •10. Массивы и класс System.Array
- •11. Типы для работы с коллекциями-списками
- •12. Типы для работы с коллекциями-множествами
- •13. Типы для работы с коллекциями-словарями
- •14. Типы для создания пользовательских коллекций
- •15. Технология linq to Objects
- •1. Оператор условия Where().
- •2. Операторы проекций.
- •3. Операторы упорядочивания.
- •4. Оператор группировки GroupBy().
- •5. Операторы соединения.
- •6. Операторы работы с множествами.
- •7. Операторы агрегирования.
- •8. Операторы генерирования.
- •9. Операторы кванторов и сравнения.
- •10. Операторы разбиения.
- •11. Операторы элемента.
- •12. Операторы преобразования.
- •16. Работа с объектами файловой системы
- •17. Ввод и вывод информации
- •17.1. Потоки данных и декораторы потоков
- •2. Классы для работы с потоками, связанными с хранилищами.
- •3. Декораторы потоков.
- •4. Адаптеры потоков.
- •17.2. Адаптеры потоков
- •18. Основы xml
- •19. Технология linq to xml
- •20. Дополнительные возможности обработки xml
- •21. Сериализация времени выполнения
- •22. Контракты данных и xml-сериализация
- •23. Состав и взаимодействие сборок
- •24. Метаданные и получение информации о типах
- •25. Позднее связывание и кодогенерация
- •26. Атрибуты
- •27. Динамическое связывание
- •28. Файлы конфигурации
- •29. Диагностика и мониторинг
- •30. Процессы и домены
- •31. Основы многопоточного программирования
- •32. Синхронизация потоков
- •32.1. Критические секции
- •32.2. Синхронизация на основе подачи сигналов
- •32.3. Неблокирующие средства синхронизации
- •32.4. Разделение данных между потоками
- •33. Библиотека параллельных задач
- •33.1. Параллелизм на уровне задач
- •33.2. Параллелизм при императивной обработке данных
- •33.3. Параллелизм при декларативной обработке данных
- •33.4. Обработка исключений и отмена выполнения задач
- •33.5. Коллекции, поддерживающие параллелизм
- •34. Асинхронный вызов методов
- •Литература
10. Массивы и класс System.Array
Класс System.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]
var 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); // смещение задано в байтах