Delphi for..in loop set enumeration order
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;
w开发者_开发问答riteln('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?
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.
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.
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".
精彩评论