Delphi for..in循环设置枚举顺序

HMc*_*McG 13 delphi enumeration

我想迭代一组特定的值.简单的例子如下

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.
Run Code Online (Sandbox Code Playgroud)

这里的示例代码完成了我的预期并产生以下内容

迭代= 1,值= 1

迭代= 2,值= 5

迭代= 3,值= 10

迭代= 4,值= 20

现在,如果我改变集合的顺序

  for b in [20,10,5,1] do
Run Code Online (Sandbox Code Playgroud)

输出与原始输出相同,即不保留值的顺序.

实现这个的最佳方法是什么?

Rob*_*edy 20

集合不是有序容器.您无法更改集合内容的顺序.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.
Run Code Online (Sandbox Code Playgroud)

  • 例如`forT in TIntegerDynArray.Create(20,10,5,1)do` (16认同)

Ric*_*iwi 11

您可以声明常量数组而不是常量数组.

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.
Run Code Online (Sandbox Code Playgroud)


jac*_*ate 5

在数学中,一组没有特定的顺序.

在pascal中,集合是bitmap集合中存在的元素的内存表示(在由基类型定义的可能元素的范围内).

你无法"改变"一组的顺序,因为根据定义,它对它毫无意义.

作为pascal的内存表示,该集合总是"按顺序"迭代.