Delphi for..in устанавливает порядок перечисления

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

program Project1;
{$APPTYPE CONSOLE}

var
  a, b: word;
  wait: string;

begin
  a := 0;
  for b in [1,5,10,20] do
  begin
    a := a + 1;
    writeln('Iteration = ', a, ',   value = ', b);
  end;

  read(wait); 

end.

Пример кода здесь делает то, что я ожидаю, и выдает следующие

Итерация = 1, value = 1

Итерация = 2, value = 5

Итерация = 3, value = 10

Итерация = 4, value = 20

Теперь, если я изменил порядок набора

  for b in [20,10,5,1] do

Результат такой же, как и оригинал, то есть порядок значений не сохраняется.

Каков наилучший способ реализовать это?

Ответ 1

Наборы не являются заказанными контейнерами. Вы не можете изменить порядок заданного содержимого. Цикл for-in всегда выполняет итерации через множества в численном порядке.

Если вам нужен упорядоченный список чисел, вы можете использовать массив или TList<Integer>.

var
  numbers: array of Word;
begin
  SetLength(numbers, 4);
  numbers[0] := 20;
  numbers[1] := 10;
  numbers[2] := 5;
  numbers[3] := 1;
  for b in numbers do begin
    Inc(a);
    Writeln('Iteration = ', a, ',   value = ', b);
  end;
end.

Ответ 2

Вы можете объявить постоянный массив вместо константного набора.

program Project1;
{$APPTYPE CONSOLE}

var
  a, b: word;
  wait: string;
const
  values: array[0..3] of word = (20,5,10,1);

begin
  a := 0;
  for b in values do
  begin
    a := a + 1;
    writeln('Iteration = ', a, ',   value = ', b);
  end;

  read(wait);

end.

Ответ 3

В математике набор не имеет особого порядка.

В pascal набор представляет собой bitmap в представлении памяти элементов, присутствующих в наборе (в пределах юниверса возможных элементов, определенных базовым типом).

Невозможно "изменить" порядок набора, потому что он по определению бессмыслен для него.

Как и в представлении памяти pascal, набор всегда повторяется "по порядку".