Seite 1 von 2
Eine Liste rückwärts durchlaufen
Verfasst: 31.07.2020 08:10
von stevie1401
Ich habe eine Liste erstellt: Liste()
Diese kann ich mit :
Ich möchte die Liste aber rückwärts durchlaufen.
Mit For / Next geht das so:
Aber wie mache ich das mit ForEach?
Re: Eine Liste rückwärts durchlaufen
Verfasst: 31.07.2020 08:20
von DarkDragon
Geht leider nicht. Früher gab es ForEach nicht mal, da musste man mit While NextElement(Liste()) arbeiten. Dasselbe kannst du mit PreviousElement(Liste()) rückwärts machen.
Re: Eine Liste rückwärts durchlaufen
Verfasst: 31.07.2020 08:43
von stevie1401
Das probiere ich gerade, aber ich bekomme es nicht hin.
Kannst du mir bitte ein kleines Beispiel geben?
Re: Eine Liste rückwärts durchlaufen
Verfasst: 31.07.2020 09:25
von Waldixxl
Hallo stevie1401
Code: Alles auswählen
NewList Test.l()
For i=1 To 10
AddElement(Test())
Test()=i
Next
For i=9 To 0 Step-1
SelectElement(Test(),i)
Debug Test()
Next
So könnte geht's, wenn ich dich richtig verstanden habe.
LG. Walter
Re: Eine Liste rückwärts durchlaufen
Verfasst: 31.07.2020 10:25
von NicTheQuick
Mit SelectElement() geht es zwar, aber verspielt die Geschwindigkeit von LinkedLists. Die optimierte Variante wäre diese hier:
Code: Alles auswählen
NewList Test.l()
For i=1 To 10
AddElement(Test())
Test()=i
Next
If LastElement(Test())
Repeat
Debug Test()
Until Not PreviousElement(Test())
EndIf
Weiß man, dass in der Liste mindestens ein Element ist, kann man sich das If auch sparen. Ich habe es nur der Vollständigkeit halber eingebaut, damit es keinen Fehler gibt, wenn die Liste leer ist. Dann sähe es so aus:
Code: Alles auswählen
LastElement(Test())
Repeat
Debug Test()
Until Not PreviousElement(Test())
Re: Eine Liste rückwärts durchlaufen
Verfasst: 31.07.2020 10:52
von Nino
Ich mache das i.d.R. so (Variante von NicTheQuicks erstem Beispiel):
Code: Alles auswählen
NewList Test.i()
For i = 1 To 10
AddElement(Test())
Test() = i
Next
e = LastElement(Test())
While e
Debug Test()
e = PreviousElement(Test())
Wend
Re: Eine Liste rückwärts durchlaufen
Verfasst: 31.07.2020 10:56
von NicTheQuick
Cool wäre es natürlich, wenn es damit funktionieren würde:
Code: Alles auswählen
ResetList(Test())
While PreviousElement(Test())
Debug Test()
Wend
Immerhin geht es ja auch vorwärts so (das war die Variante bevor es ForEach gab):
Code: Alles auswählen
ResetList(Test())
While NextElement(Test())
Debug Test()
Wend
Warum also nicht rückwärts?
Re: Eine Liste rückwärts durchlaufen
Verfasst: 31.07.2020 11:17
von diceman
Ich gehe davon aus, du redest von einer strukturierten Liste, mit Elementen, welche einer Struktur zugeordnet sind ...
Wäre folgendes eine Option für dich (sorry, schreibe von der Arbeit aus, kann also keinen Beispiel-Code posten ...):
Zunächst brauchst du in der übergeordneten Struktur ein gesondertes Feld für den Index, welcher aufsteigend bei Erstellung der Elemente zugeordnet wird.
Also erstes Element = 1, zweites Element = 2, etc.
Dann sortierst du dir die Liste nach dem Index, aber in umgekehrter Reihenfolge:
Code: Alles auswählen
SortStructuredList(myList(), #PB_Sort_Descending, OffsetOf(MY_STRUCT\index), TypeOf(MY_STRUCT\index))
Und,
voila, schon kannst du mit
in umgekehrter Reihenfolge durchiterieren.
Um die Reihenfolge wieder umzukehren, benutzt du die Konstante
#PB_Sort_Ascending.
Der
SortStructuredList-Befehl ist meiner Erfahrung nach ausreichend schnell, und es lassen sich tolle Dinge damit anstellen.
Viel Erfolg!
Re: Eine Liste rückwärts durchlaufen
Verfasst: 31.07.2020 11:19
von stevie1401
Ah! Wieder etwas dazugelernt.
Aus der Hilfe ist nicht wirklich ersichtlich wie das alles funktioniert.
So ging ich davon aus, dass Lastelement(Liste()) lediglich die Nr des letztens Elements angibt.
Ich habe es immer mit Selectelement(Lasteelement(Liste())) versucht, was nicht funktionierte.
Danke für eure Hilfe!
Re: Eine Liste rückwärts durchlaufen
Verfasst: 31.07.2020 11:35
von Nino
NicTheQuick hat geschrieben:Warum also nicht rückwärts?
Daran habe ich auch schon gedacht.
Ein PB-Befehl wie
ResetListAfterLastElement() wäre schön ... aber mit einem kürzeren Namen.
diceman hat geschrieben:Ich gehe davon aus, du redest von einer strukturierten Liste, mit Elementen, welche einer Struktur zugeordnet sind ...
Wäre folgendes eine Option für dich (sorry, schreibe von der Arbeit aus, kann also keinen Beispiel-Code posten ...):
Zunächst brauchst du in der übergeordneten Struktur ein gesondertes Feld für den Index, welcher aufsteigend bei Erstellung der Elemente zugeordnet wird.
Das ist unnötig umständlich
Einfache, direkte generische Lösungen die mit jeder Art von Liste funktionieren wurden bereits gepostet.