Коллекции
Коллекция — это тип, который содержит набор значений одного или различных типов и позволяет обращаться к этим значением. Можно выделить две группы коллекций по способу хранения данных: списки значений и словари (наборы пар «ключ-значение»).
Базовые типы
В основе всей иерархии типов, предназначенных для работы с коллекциями, лежит тип Обходимое<ТипЭлемента>
.
Следующими в иерархии расположены типы ЧитаемаяКоллекция<ТипЭлемента>
и ЧитаемоеСоответствие<ТипКлюча,ТипЗначения>
. Эти типы реализуют базовый контракт, необходимый для работы со списком экземпляров и со словарем.
Фиксированные и обычные коллекции
Типы, которые реализуют механизмы работы с коллекциями, можно разделить на две части:
- типы, которые не предоставляют возможность изменять свой состав (фиксированные коллекции);
- типы, которые предоставляют возможность изменить свой состав (обычные коллекции).
Типы для работы с коллекциями
В языке существуют следующие типы для работы с коллекциями:
- Массив<ТипЭлемента> — список элементов, без контроля уникальности. Поддерживается доступ по индексу;
- Множество<ТипЭлемента> — список уникальных элементов. Не поддерживается доступ по индексу;
- Соответствие<ТипКлюча, ТипЗначения> — словарь, список пар «ключ-значение». В коллекции поддерживается уникальность по ключу. Поддерживается доступ по индексу.
Методы последовательной обработки коллекций
При выполнении операций над коллекциями вместо циклов и условных операторов для обработки данных можно использовать последовательный вызов цепочки методов. Это позволит ускорить и упростить написание кода.
Методы делятся на последовательные и терминальные. К последовательным методам относятся те, которые могут применяться к потоку данных несколько раз без его завершения. Они не меняют элементы последовательности или возвращают новую последовательность с результатами. Например, Преобразовать()
, Фильтровать()
, Сортировать()
, ДляКаждого()
. К терминальным методам относятся методы, которые применяются к потоку только один раз и возвращают результат. Это такие методы, как ВМассив()
, НетСоответствий()
, ПосчитатьРазмер()
.
В результате вызова цепочки последовательных методов неявно создаются элементы типа Последовательность<ТипЭлемента>, то есть никаких реальных действий не выполняется, пока не будет вызван последний, терминальный, метод в цепочке.
Примеры последовательного вызова методов
Пример использования запросов
// Без использования потоковой обработки
метод ПолучитьСписокПользователей(Получатели: Массив<Строка>): Массив<Пользователи.Ссылка?>
пер Запрос = Запрос{
Выбрать
Код, Пользователь
Из
Сотрудники
Где
Код В (%Получатели)
}
пер Пользователи = новый Массив<Пользователи.Ссылка?>()
исп РезультатЗапроса = Запрос.Выполнить()
для Строка из РезультатЗапроса
если Строка.Пользователь != Неопределено
Пользователи.Добавить(Строка.Пользователь)
;
;
возврат Пользователи
;
// С использованием потоковой обработки
метод ПолучитьСписокПользователей1(Получатели: Массив<Строка>): Массив<Пользователи.Ссылка?>
возврат Запрос{
Выбрать
Код, Пользовател ь
Из
Сотрудники
Где
Код В (%Получатели)
}
.Выполнить()
.Преобразовать(Элемент -> Элемент.Пользователь, Истина)
;
Пример использования метода ЕстьСоответствия()
// Без использования потоковой обработки
метод ВычетыНаДетейВидимость(): Булево
для ЗаписьОРебенке из ТаблицаДети.Дети
если ЗаписьОРебенке.Удалено
продолжить
;
возврат Истина
;
возврат Ложь
;
// С использованием потоковой обработки
метод ВычетыНаДетейВидимость(): Булево
возврат ТаблицаДети.Дети.ЕстьСоответствия(Элемент -> не Элемент.Удалено)
;
Пример вызова метода СортироватьПо()
в цепочке
Если метод СортироватьПо()
вызывается в цепочке вызовов, после него можно вызвать метод ПотомСортироватьПо()
. Тогда сортировка будет выполняться по полям поочередно в соответствующем порядке.
структура Сотрудник
пер Фамилия: Строка
пер Должность: РольСотрудника?
пер Возраст: Число
;
метод СортировкаПоДолжностиИФамилии(): Массив<Сотрудник>
знч СписокСотрудников = [новый Сотрудник(Фамилия = "Яковлев", Должность = РольСотрудника.Менеджер),
новый Сотрудник(Фамилия = "Смирнов", Должность = РольСотрудника.Руководитель),
новый Сотрудник(Фамилия = "Иванов", Должность = РольСотрудника.Менеджер)]
// (Яковлев, Менеджер) (Смирнов, Руководитель) (Иванов, Менеджер)
возврат СписокСотрудников.СортироватьПо(элемент -> элемент.Должность.ВСтроку())
.ПотомСортироватьПо(элемент -> элемент.Фамилия)
// (Иванов, Менеджер) (Яковлев, Менеджер) (Смирнов, Руководитель)
;