Перейти к основному содержимому

Коллекции

Коллекция — это тип, который содержит набор значений одного или различных типов и позволяет обращаться к этим значением. Можно выделить две группы коллекций по способу хранения данных: списки значений и словари (наборы пар «ключ-значение»).

Базовые типы

В основе всей иерархии типов, предназначенных для работы с коллекциями, лежит тип Обходимое<ТипЭлемента>.

Следующими в иерархии расположены типы ЧитаемаяКоллекция<ТипЭлемента> и ЧитаемоеСоответствие<ТипКлюча,ТипЗначения>. Эти типы реализуют базовый контракт, необходимый для работы со списком экземпляров и со словарем.

Фиксированные и обычные коллекции

Типы, которые реализуют механизмы работы с коллекциями, можно разделить на две части:

  • типы, которые не предоставляют возможность изменять свой состав (фиксированные коллекции);
  • типы, которые предоставляют возможность изменить свой состав (обычные коллекции).

Типы для работы с коллекциями

В языке существуют следующие типы для работы с коллекциями:

Методы последовательной обработки коллекций

При выполнении операций над коллекциями вместо циклов и условных операторов для обработки данных можно использовать последовательный вызов цепочки методов. Это позволит ускорить и упростить написание кода.

Методы делятся на последовательные и терминальные. К последовательным методам относятся те, которые могут применяться к потоку данных несколько раз без его завершения. Они не меняют элементы последовательности или возвращают новую последовательность с результатами. Например, Преобразовать(), Фильтровать(), Сортировать(), ДляКаждого(). К терминальным методам относятся методы, которые применяются к потоку только один раз и возвращают результат. Это такие методы, как ВМассив(), НетСоответствий(), ПосчитатьРазмер().

В результате вызова цепочки последовательных методов неявно создаются элементы типа Последовательность<ТипЭлемента>, то есть никаких реальных действий не выполняется, пока не будет вызван последний, терминальный, метод в цепочке.

Примеры последовательного вызова методов

Пример использования запросов

// Без использования потоковой обработки
метод ПолучитьСписокПользователей(Получатели: Массив<Строка>): Массив<Пользователи.Ссылка?>
пер Запрос = Запрос{
Выбрать
Код, Пользователь
Из
Сотрудники
Где
Код В (%Получатели)
}
пер Пользователи = новый Массив<Пользователи.Ссылка?>()
исп РезультатЗапроса = Запрос.Выполнить()
для Строка из РезультатЗапроса
если Строка.Пользователь != Неопределено
Пользователи.Добавить(Строка.Пользователь)
;
;
возврат Пользователи
;

// С использованием потоковой обработки
метод ПолучитьСписокПользователей1(Получатели: Массив<Строка>): Массив<Пользователи.Ссылка?>
возврат Запрос{
Выбрать
Код, Пользователь
Из
Сотрудники
Где
Код В (%Получатели)
}
.Выполнить()
.Преобразовать(Элемент -> Элемент.Пользователь, Истина)
;

Пример использования метода ЕстьСоответствия()

// Без использования потоковой обработки
метод ВычетыНаДетейВидимость(): Булево
для ЗаписьОРебенке из ТаблицаДети.Дети
если ЗаписьОРебенке.Удалено
продолжить
;
возврат Истина
;
возврат Ложь
;

// С использованием потоковой обработки
метод ВычетыНаДетейВидимость(): Булево
возврат ТаблицаДети.Дети.ЕстьСоответствия(Элемент -> не Элемент.Удалено)
;

Пример вызова метода СортироватьПо() в цепочке

Если метод СортироватьПо() вызывается в цепочке вызовов, после него можно вызвать метод ПотомСортироватьПо(). Тогда сортировка будет выполняться по полям поочередно в соответствующем порядке.

структура Сотрудник
пер Фамилия: Строка
пер Должность: РольСотрудника?
пер Возраст: Число
;

метод СортировкаПоДолжностиИФамилии(): Массив<Сотрудник>
знч СписокСотрудников = [новый Сотрудник(Фамилия = "Яковлев", Должность = РольСотрудника.Менеджер),
новый Сотрудник(Фамилия = "Смирнов", Должность = РольСотрудника.Руководитель),
новый Сотрудник(Фамилия = "Иванов", Должность = РольСотрудника.Менеджер)]
// (Яковлев, Менеджер) (Смирнов, Руководитель) (Иванов, Менеджер)

возврат СписокСотрудников.СортироватьПо(элемент -> элемент.Должность.ВСтроку())
.ПотомСортироватьПо(элемент -> элемент.Фамилия)
// (Иванов, Менеджер) (Яковлев, Менеджер) (Смирнов, Руководитель)
;