从任何给定的起点迭代列表并从头开始继续?

时间:2016-08-07 02:15:30

标签: list loops delphi

通过列表进行迭代是微不足道的。在这种情况下,我正在处理的组件的TCollection属性。从0索引迭代到最大索引我没有问题 - 我已经做了很多次。

然而,我正在研究一些现在需要以不同方式迭代的东西。我需要从任何给定的起点迭代一个收集项列表 - 然后完成所有项的完整循环。在最后一个列表项之后,它将自动从列表的开头继续迭代。

澄清:传统迭代的工作方式如下:

for X := 0 to SomeList.Count-1 do ...

但我可以在其他方面开始,例如:

for X := StartingPoint to EndingPoint do ...

它是" EndingPoint"这是我无法弄清楚的。迭代只会增加。但就我而言,我需要将当前的迭代位置重置为开头 - 正好在迭代的中间。 EndingPoint可能小于StartingPoint,但它仍然需要完成一个完整的循环,一旦到达结尾,它就会从头开始。

所以,在5个项目的列表中,而不仅仅是......

0, 1, 2, 3, 4

我可以从2开始,想做...

2, 3, 4, 0, 1

我如何完成这样的循环?

1 个答案:

答案 0 :(得分:15)

for foo := 0 to Pred(SomeList.Count) do begin
  i := (foo + StartingPoint) mod SomeList.Count;
  ...
end;

在循环中使用索引i;忽略foo变量。

从范围的中间到结尾,i将等于foo + StartingPoint。在此之后,mod运算符将有效地使i“回绕”再次开始。