2016-08-07 21 views
7

Iterowanie listy jest banalne. W tym przypadku właściwość TCollection komponentu, nad którym pracuję. Nie mam problemu z iterowaniem z indeksu 0 do maksymalnego indeksu - zrobiłem to już wiele razy.Powtórz listę z dowolnego punktu początkowego i kontynuuj od początku?

Jednak pracuję nad czymś, co wymaga nieco innej iteracji. Muszę przejrzeć listę elementów kolekcjonerskich z dowolnego punktu początkowego - a mimo to ukończyć pełną pętlę wszystkich elementów. Po ostatniej pozycji listy automatycznie kontynuuje iterację od początku listy.

Dla wyjaśnienia: tradycyjna iteracja działa jak:

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

Ale może zacznę go w jakimś innym miejscu, takie jak:

for X := StartingPoint to EndingPoint do ... 

I to, że "EndingPoint", których nie mogę dowiedzieć się, . Iteracja tylko się zwiększa. Ale w moim przypadku muszę zresetować bieżącą pozycję iteracji na początek - dokładnie w środku iteracji. EndingPoint może być mniejszy niż StartingPoint, ale nadal musi wykonać pełną pętlę, w której po dojściu do końca, odbiera ją od początku.

Tak, w liście z 5 elementów, a nie tylko będzie ...

0, 1, 2, 3, 4 

może zacznę na 2, i chce zrobić ...

2, 3, 4, 0, 1 

Jak to zrobić osiągnąć taką pętlę?

Odpowiedz

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

Użyj indeksu i wewnątrz pętli; zignoruj ​​zmienną foo.

Od środka do końca zakresu, i będzie równa foo + StartingPoint. Następnie operator mod skutecznie sprawi, że i "zawinie się" na początek.

+0

Taki idealny. Bardzo doceniam. –