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 :

Code: Alles auswählen

ForEach Liste()
debug Liste()\Eintrag
next
Ich möchte die Liste aber rückwärts durchlaufen.
Mit For / Next geht das so:

Code: Alles auswählen

For i=1 to 100 step -1
debug i
next i
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? :D

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

Code: Alles auswählen

ForEach
...
Next
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. :allright:

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? :D
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.