Reputation: 2060
I want to iterate through a set of specific values. Simple example below
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.
The sample code here does what I expect and produces the following
Iteration = 1, value = 1
Iteration = 2, value = 5
Iteration = 3, value = 10
Iteration = 4, value = 20
Now if I change the order of the set
for b in [20,10,5,1] do
The output is the same as the original, that is the order of the values is not preserved.
What is the best way to implement this?
Upvotes: 17
Views: 29116
Reputation: 107716
You can declare a constant array instead of a constant set.
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.
Upvotes: 13
Reputation: 17203
In math, a set have no particular order.
In pascal, a set is a bitmap
in memory representation of the elements present in the set (within a universe of possible elements defined by the base type).
There's no way you can "change" the order of a set, because it is, by definition, meaningless for it.
As the in memory representation by pascal, the set is always iterated "in order".
Upvotes: 8
Reputation: 163287
Sets are not ordered containers. You cannot change the order of a set's contents. A for-in loop always iterates through sets in numerical order.
If you need an ordered list of numbers, then you can use an array or 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.
Upvotes: 25