- •А.А. Волосевич
- •1. Работа с Числами
- •2. Дата и время
- •3. Работа со строками и текстом
- •4. Преобразование информации
- •5. Отношения равенства и порядка
- •Сравнение для выяснения равенства
- •Сравнение для выяснения порядка
- •6. Жизненный цикл объектов
- •Алгоритм «сборки мусора»
- •Финализаторы и интерфейс iDisposable
- •7. Перечислители и итераторы
- •8. Интерфейсы стандартных коллекций
- •9. Массивы и класс system.Array
- •10. Типы для работы с коллекциями-списками
- •11. Типы для работы с коллекциями-множествами
- •12. Типы для работы с коллекциями-словарями
- •13. Типы для создания пользовательских коллекций
- •14. Технология linq to objects
- •1. Оператор условия Where().
- •2. Операторы проекций.
- •3. Операторы упорядочивания.
- •4. Оператор группировки GroupBy().
- •5. Операторы соединения.
- •6. Операторы работы с множествами.
- •7. Операторы агрегирования.
- •8. Операторы генерирования.
- •9. Операторы кванторов и сравнения.
- •10. Операторы разбиения.
- •11. Операторы элемента.
- •12. Операторы преобразования.
- •15. Работа с объектами файЛовой системы
- •16. Ввод и вывод информации
- •Потоки данных и декораторы потоков
- •2. Классы для работы с потоками, связанными с хранилищами.
- •3. Декораторы потоков.
- •4. Адаптеры потоков.
- •Адаптеры потоков
- •17. Основы xml
- •18. Технология linq to xml
- •Создание, сохранение, загрузка xml
- •Запросы, модификация и трансформация xml
- •Пространства имён xml
- •19. ДОполнительные возможности обработки xml
- •20. Сериализация
- •Сериализация времени выполнения
- •Сериализация контрактов данных
- •21. Состав и взаимодействие сборок
- •22. Метаданные и получение информации о типах
- •23. Позднее связывание и кодогенерация
- •24. Динамические типы
- •25. Атрибуты
- •26. Файлы конфигуРации
- •27. Основы мНогопоточноГо программирования
- •28. Синхронизация потоков
- •29. Библиотека параллельных расширений
- •Параллелизм на уровне задач
- •Параллелизм при императивной обработке данных
- •Параллелизм при декларативной обработке данных
- •Обработка исключений и отмена выполнения задач
- •Коллекции, поддерживающие параллелизм
- •30. Асинхронный вызов методов
- •31. Процессы и домены
- •32. Безопасность
- •Разрешения на доступ
- •Изолированные хранилища
- •Криптография
- •33. Диагностика
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); // смещение задано в байтах!