2016-08-07 15 views
7

Iterieren durch eine Liste ist trivial. In diesem Fall eine TCollection Eigenschaft einer Komponente, an der ich arbeite. Ich habe kein Problem mit der Iteration von 0 Index auf den maximalen Index - ich habe es oft getan.Iterate durch die Liste von einem beliebigen Startpunkt und weiter von Anfang an?

Allerdings arbeite ich jetzt an etwas, das ein bisschen anders durchlaufen muss. Ich muss eine Liste von Sammlungsobjekten von jedem beliebigen Startpunkt aus durchlaufen - und trotzdem eine vollständige Schleife aller Elemente abschließen. Nach dem letzten Listenelement wird die Iteration vom Anfang der Liste automatisch fortgesetzt.

Um zu klären: traditionelle Iteration funktioniert wie:

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

Aber ich es an einem anderen Punkt beginnen kann, wie zum Beispiel:

for X := StartingPoint to EndingPoint do ... 

Und es ist, dass „EndingPoint“, die ich nicht herausfinden können, . Iteration erhöht sich nur. Aber in meinem Fall muss ich diese aktuelle Iterationsposition an den Anfang zurücksetzen - genau in der Mitte der Iteration. EndingPoint möglicherweise weniger als die StartingPoint, aber es muss immer noch eine vollständige Schleife, wo einmal das Ende erreicht, es beginnt von Anfang an.

in einer Liste von 5 Artikeln Also, anstatt nur gehen ...

0, 1, 2, 3, 4 

Ich kann bei 2 beginnen, und tun will ...

2, 3, 4, 0, 1 

Wie kann ich eine solche Schleife erreichen?

Antwort

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

Verwenden des Index i innerhalb der Schleife; Ignoriere die foo Variable.

Von der Mitte bis zum Ende des Bereichs entspricht ifoo + StartingPoint. Danach wird der Operator mod effektiv i "Wrap around" zum Start wieder machen.

+0

So perfekt. Sehr dankbar. –