通过列表进行迭代是微不足道的。在这种情况下,我正在处理的组件的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
我如何完成这样的循环?
答案 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
“回绕”再次开始。