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

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

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, значение = 1

итерация = 2, значение = 5

итерация = 3, Значение = 10

итерация = 4, значение = 20

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

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

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

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

3 ответов


наборы не заказывала контейнеры. Нельзя изменить порядок содержимого набора. Цикл 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.

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

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.

в математике множество не имеет определенного порядка.

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

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

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