AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

IEnumerable rückwärts durchlaufen

Ein Thema von Der schöne Günther · begonnen am 16. Okt 2013 · letzter Beitrag vom 22. Okt 2013
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

IEnumerable rückwärts durchlaufen

  Alt 16. Okt 2013, 10:45
Delphi-Version: XE2
Meine Hausaufgaben habe ich nicht wirklich gemacht, IEnumerable bzw. IEnumerator habe ich mir noch nicht wirklich im Detail angesehen.

Ich habe beispielsweise eine generische Liste. Ich iteriere mit einem "for ... in" darüber. Ich möchte jetzt aber nicht "vorwärts" sondern "rückwärts" über die Liste rutschen. Wie macht der Profi das? Oder gibt es vielleicht einen Standard "Rückwärts"-Enumerator den ich irgendwie verwenden kann?

Direkt (etwas unleserlich) anonym die drei IEnumerator-Methoden zu implementieren geht wahrscheinlich nicht und bläht den Code wohl zu sehr auf...
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.197 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: IEnumerable rückwärts durchlaufen

  Alt 16. Okt 2013, 10:57
Das geht mit IEnumerable nicht.
MS hat das als nur nach vorne durchlaufbare Liste definiert. Siehe http://msdn.microsoft.com/de-de/libr...=vs.80%29.aspx

Aber was ist der Sinn davon das Rückwärts zu durchlaufen?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: IEnumerable rückwärts durchlaufen

  Alt 16. Okt 2013, 11:04
Du kannst die Liste vor der Verarbeitung "umdrehen".
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: IEnumerable rückwärts durchlaufen

  Alt 16. Okt 2013, 11:10
Die strikte Vorschrift von "vorwärts" lese ich auch aus der .NET-Doku jetzt nicht heraus. Wenn ich es auf die Schnelle richtig sehe, kann ich den Enumerator, den bsp. eine stinknormale TList zurückgibt, nicht zur Laufzeit ändern, oder? Sonst hätte ich mir ja für den Fall meinen eigenen "Spaß-Enumerator" basteln können...

Die Liste mit Reverse() umzudrehen ist eine gute Idee. Nur leider werkelt da keine Magie im Hintergrund, da wird ja physikalisch wirklich jeder Eintrag mit seinem Gegenstück vertauscht:
Delphi-Quellcode:
procedure TList<T>.Reverse;
var
  tmp: T;
  b, e: Integer;
begin
  b := 0;
  e := Count - 1;
  while b < e do
  begin
    tmp := FItems[b];
    FItems[b] := FItems[e];
    FItems[e] := tmp;
    Inc(b);
    Dec(e);
  end;
end;
Meine Motivation war eigentlich aus Geschwindigkeitsgründen nicht ständig mit einem schrumpfenden Zahlen-Index in die Liste zu greifen sondern den Cursor des Enumerators zu nutzen. Ein Umdrehen der Liste ist zwar wirklich elegant, dauert aber wohl zu lange...
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: IEnumerable rückwärts durchlaufen

  Alt 16. Okt 2013, 11:20
Du könntest das auch in ein Objekt kapseln und eine revertete (wat'n Wort) "Schattenliste" mitführen. Die könntest Du dann entsprechend pflegen. Dafür dauert dann das Add länger ...
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#6

AW: IEnumerable rückwärts durchlaufen

  Alt 16. Okt 2013, 11:25
Die strikte Vorschrift von "vorwärts" lese ich auch aus der .NET-Doku jetzt nicht heraus.
Es ist auch keine Vorschrift, sondern die ergibt sich daraus, dass ein IEnumerable zwar eine implizite aber keine definierte Reihenfolge hat.

Enumeriert man die Werte eines Dictionarys, kommen die in irgendeiner Reihenfolge. Dadurch macht auch das Umkehren der Reihenfolge keinen Sinn.

Es gibt andere Interfaces, die auf definierte Reihenfolgen Rücksicht nehmen.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: IEnumerable rückwärts durchlaufen

  Alt 16. Okt 2013, 11:45
Ich habe "for .. in" schon immer mehr wie eine Collection verstanden. Also eine lose Ansammlung von gleichartigen Daten, die prinzipbedingt keiner Reihenfolge angehören. Wenn ich geordnete Listen nutze, bin ich daher immer beim "for i := 0 to MAX" geblieben, einfach weil es meinem Verständnis eher entsprach.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: IEnumerable rückwärts durchlaufen

  Alt 16. Okt 2013, 12:13
Jetzt fing ich gerade an mich zu wundern, warum der Enumerator eines TStack auch vorwärts läuft, gerade hier wäre doch ein "Abräumen" logisch.

Aber dann fiel mir auch auf, dass der indizierte Zugriff überhaupt so abläuft, wie ich dachte: Ich dachte, TList sei eine klassische verkettete Liste und bei jedem Zugriff läuft er ganz von Anfang an so lange, bis er oft genug zum nächsten Element gesprungen ist. Bei großen Listen weiter hinten wäre das ja der Tod. Stattdessen ist das ja einfach nur ein Array!
Das erklärt auch, was Capacity bedeutet.

Wieder ein weiteres Mysterium geklärt. Die Welt ist gut.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: IEnumerable rückwärts durchlaufen

  Alt 22. Okt 2013, 12:59
Eventuell als Zusatzinfo noch:

es gibt bestimmte IEnumerable Methoden, die verzögert ausgeführt werden und andere direkt.
Verzögerte Ausführung heißt, dass beim Durchlaufen erst die Elemente der Quelle durchlaufen werden (und das auch nur 1mal für einen kompletten Durchlauf) - z.B. Where oder Take

Einige Operationen können das nicht - zum Beispiel Reverse. Hierbei ist die Implementierung in .Net so, dass die Quelle ausgelesen und in ein Array gepackt wird. Dieses wird dann vom letzten bis zum ersten Element zurückgegeben.

Wenn man beachtet, dass hinter IEnumerable auch theoretisch eine unendliche Menge stecken kann, sieht man, dass bestimmte Operationen damit keinen Sinn machen würden.

Für eine for in Schleife spielt auch der Enumerator eine Rolle, welcher einen State hat - in dem Falle einer verketteten Liste könnte er also problemlos das aktuelle Element wissen, so dass du keinen Schlemiel hast.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (22. Okt 2013 um 13:01 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#10

AW: IEnumerable rückwärts durchlaufen

  Alt 22. Okt 2013, 20:02
...so dass du keinen Schlemiel hast.
Man lernt nie aus.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz