Последовательности
Последовательность - это набор данных, которые можно перебрать один за другим в некотором порядке. К разновидностям последовательностей относятся одномерные динамические массивы array of T, списки List<T>, двусвязные списки LinkedList<T>, множества HashSet<T> и SortedSet<T>.
Тип последовательности конструируется следующим образом:
sequence of
тип элементов
Последовательности доступны только на чтение. Если требуется изменить последовательность, то генерируется и возвращается новая последовательность.
Тип sequence of T является синонимом типа .NET System.Collections.Generic.IEnumerable<T>, а последовательность - синонимом объекта типа, поддерживающего интерфейс System.Collections.Generic.IEnumerable<T>.
Инициализация последовательности
Последовательность инициализируется с помощью стандартных функций Seq, SeqGen, SeqFill, SeqWhile, SeqRandom, SeqRandomReal, ReadSeqInteger, ReadSeqReal, ReadSeqString. Например:
var s: sequence of integer;
s := Seq(1,3,5);
s.Println;
s := SeqGen(1,x->x*2,10);
writeln(s);
Хранение последовательности
Последовательность не хранится целиком в памяти. Элементы последовательности генерируются алгоритмически и возвращаются по одному при обходе.
Таким образом, в коде
var s := SeqFill(1,10000000);
writeln(s.Sum());
основное время выполнения будет занимать вторая строка, а выполнение первой строки будет сводиться лишь к запоминанию алгоритма генерации последовательности в переменной s.
Соединение последовательностей
Две последовательности одного типа могут быть соединены операцией +, при этом вторая последовательность дописывается в конец первой. Например:
Seq(1,2,3) + Seq(5,6,7)
Seq(1,2,3) + Arr(5,6,7)
Кроме того, к последовательности некоторого типа можно присоединить операцией + значение этого типа как первый или последний элемент последовательности, например:
Seq(1,2,3) + 5
3 + Seq(5,6,7)
3 + Seq(5,6,7) + 9
Операция + является сокращённым вариантом операции Concat.
Для последовательностей доступна также операция умножения на число:
Seq(1,2,3) * 3
означает повторение последовательности 1 2 3 три раза: 1 2 3 1 2 3 1 2 3
Цикл по последовательности
Элементы последовательности можно обойти с помощью цикла foreach:
foreach var x in s do
if x>2 then
Print(x);
Совместимость по присваиванию
Переменной типа "последовательность" с элементами типа
T можно присвоить одномерный массив
array of T, список List<T>,
двусвязный список LinkedList<T>, множество
HashSet<T> или
SortedSet<T>, а также объект любого класса, поддерживающего
интерфейс
System.Collections.Generic.IEnumerable<T>
.
Стандартные подпрограммы и методы
Для последовательностей доступны:
- Методы обработки последовательностей
- Подпрограммы для генерации последовательностей
- Подпрограммы для генерации бесконечных последовательностей
- Методы расширения для последовательностей