Списки

Список List<T> похож на массив, но позволяет добавлять и удалять элементы, изменяя свой размер во время выполнения программы.

Пустой список

Пустой список можно создать с помощью универсального инициализатора коллекции [].

begin
  var L: List<integer> := [];

  L.Println;
end.

Создание списка из диапазона

Функция Lst создаёт список из диапазона значений.

begin
  var L := Lst(1..10);

  L.Println;
end.

Результат:

1 2 3 4 5 6 7 8 9 10

Добавление элемента

Метод Add добавляет новый элемент в конец списка.

begin
  var L: List<integer> := [];

  L.Add(3);
  L.Add(8);
  L.Add(5);

  L.Println;
end.

Результат:

3 8 5

Добавление нескольких элементов

Метод AddRange добавляет в список сразу несколько элементов.

begin
  var L := Lst(10,20);

  L.AddRange([1,2,3]);

  L.Println;
end.

Результат:

10 20 1 2 3

Количество элементов

Свойство Count содержит количество элементов списка.

begin
  var L := Lst(10,20,30,40);

  Println(L.Count);
end.

Результат:

4

Доступ и изменение элементов

К элементам списка можно обращаться по индексу. Цикл for удобно использовать, когда нужен индекс элемента или требуется изменять элементы списка.

begin
  var L := Lst(1,2,3,4,5);

  for var i := 0 to L.Count - 1 do
    L[i] *= 2;

  L.Println;
end.

Результат:

2 4 6 8 10

Перебор списка

Цикл foreach используется для последовательного перебора всех элементов списка.

begin
  var L := Lst(3,8,1,6);

  foreach var x in L do
    Print(x);
end.

Результат:

3 8 1 6

Поиск элемента

Операция in проверяет, содержится ли элемент в списке, а IndexOf возвращает индекс первого найденного элемента или -1, если такого элемента нет.

begin
  var L := Lst(3,8,1,6,4);

  Println(L.IndexOf(6));
  Println(L.IndexOf(10));

  Println(8 in L);
  Println(20 in L);
end.

Результат:

3
-1
True
False

Сумма, минимум и максимум

Для числового списка можно непосредственно вычислить сумму, минимальный и максимальный элементы.

begin
  var L := Lst(7,2,9,4,5);

  Println(L.Sum);
  Println(L.Min);
  Println(L.Max);
end.

Результат:

27
2
9

Преобразование массива в список

Метод ToList преобразует массив в список.

begin
  var a: array of integer := [3,8,1,6];

  var L: List<integer> := a.ToList;

  L.Println;
end.

Результат:

3 8 1 6

Преобразование списка в массив

Метод ToArray преобразует список в массив.

begin
  var L: List<integer> := Lst(3,8,1,6);

  var a: array of integer := L.ToArray;

  a.Println;
end.

Результат:

3 8 1 6

Копирование списка

Функция Copy создаёт независимую копию списка. При обычном присваивании две переменные ссылаются на один и тот же список.

begin
  var L1 := Lst(10,20,30);
  var L2 := Copy(L1);
  var L3 := L1;

  L2[0] := 100;
  L3[1] := 200;

  L1.Println;
  L2.Println;
  L3.Println;
end.

Результат:

10 200 30
100 20 30
10 200 30

Очистка списка

Метод Clear удаляет все элементы списка.

begin
  var L := Lst(1,2,3,4);

  L.Clear;

  Println(L.Count);
  L.Println;
end.

Результат:

0

Вставка и удаление элементов

Методы Insert, Remove и RemoveAt позволяют вставлять и удалять элементы списка.

begin
  var L := Lst(10,20,30,40);

  L.Insert(1,15);
  L.Remove(30);
  L.RemoveAt(0);

  L.Println;
end.

Результат:

15 20 40

Список делителей числа

Список удобно использовать, когда заранее неизвестно, сколько элементов будет найдено.

function Divisors(n: integer): List<integer>;
begin
  Result := [];

  for var i := 1 to n do
    if n mod i = 0 then
      Result.Add(i);
end;

begin
  var L: List<integer> := Divisors(24);

  L.Println;
end.

Результат:

1 2 3 4 6 8 12 24