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