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, набор всегда повторяется "по порядку".