![]() |
AW: For xx In xxx Schleife rückwärts?
Zitat:
![]() Zitat:
Schlicht weil es absolut keinen Sinn macht, wenn man auf bestimmte Indizes zugreifen will (eine bestimmte Reihenfolge eben) diese nicht zu benutzen... |
AW: For xx In xxx Schleife rückwärts?
Delphi-Quellcode:
Quelle:
type
IEnumerable<T> = interface(IEnumerable) /// <summary> /// Inverts the order of the elements in a sequence. /// </summary> function Reversed: IEnumerable<T>; end; ![]()
Delphi-Quellcode:
Ausgabe:
program Project1;
{$AppType Console} {$R *.res} uses System.SysUtils, Spring.Collections, Spring.Collections.Lists; procedure Run; type T = String; var List: IList<T>; Item: T; begin List := TList<T>.Create; List.AddRange(['Eins.', 'Zwei.', 'Drei.', 'Vier.']); for Item in List.Reversed do WriteLn(Item); end; begin try Run; except on E: Exception do WriteLn(E.ClassName + ': ' + E.Message); end; if DebugHook <> 0 then ReadLn; end.
Code:
Vier.
Drei. Zwei. Eins. |
AW: For xx In xxx Schleife rückwärts?
Dass etwas geht heisst nicht gleich, dass es auch gut ist. Dass andere dieses etwas gemacht haben ebensowenig, da können jetzt Beispiele noch und nöcher kommen.
Man Verschleiert die Abhängigkeit von einer definierten Reihenfolge durch die Nutzung einer Operation auf einer prinzipiell unsortierten Menge. Dass sie es in der Praxis oftmals dennoch ist, ist nicht Bestandteil des Vorganges, und muss von keiner Implementierung garantiert werden, bzw. kann es in unterschiedlichen Implementierungen unterschiedlich gehandhabt werden. Und allein das würde mich immer wieder dazu motivieren in diesen Fällen for..to zu nutzen, zumal es erheblich besser dokumentiert. Mehr als warnen kann man leider nicht. |
AW: For xx In xxx Schleife rückwärts?
Oder noch besser: Man stelle sich einen zukünftigen Compiler vor, der merkt dass innerhalb der for-in Schleife keine Seiteneffekte auftreten. Und *wuppdi* werden alle 30 Iterationen gleichzeitig ausgeführt. (Bis der Delphi-Compiler das kann habe wir bestimmt 32-Kern CPUs in Laptops) Die Reihenfolge wäre dann nicht-deterministisch und hinge vom Scheduler ab.
Genial, wa? |
AW: For xx In xxx Schleife rückwärts?
Das würde ich jetzt nicht einmal als zu futuristisch ansehen, denn mit LLVM als Backend muss das ja nicht einmal der Delphi Compiler machen, sondern könnte es dort implementiert werden und einfach genutzt werden. Insofern könnte so etwas schneller kommen als man denkt.
|
AW: For xx In xxx Schleife rückwärts?
Einträge in einer Reihenfolge anzuordnen gehört sowohl zum Wesen einer Liste als auch zum Wesen einer Aufzählung. Es ist wenigstens intuitiv, zu erwarten, dass die Aufzählung einer Liste die Einträge in eben dieser Reihenfolge liefert - und dass diese Reihenfolge umgekehrt werden kann.
Sich dieser Intuition zu verweigern ist ein Fehler. Man kann Menschen auch unnötig verunsichern, wenn man gegen ihren gesunden Verstand redet. Es ist nicht die For-in-Anweisung, welche die Reihenfolge bestimmt, sondern der Aufzähler. Auch die Übersetzung der Schleife für parallele Ausführung wird diese Reihenfolge nicht ändern. Wenn festgestellt werden kann, dass derselbe Schleifenkörper mehrmals parallel ausgeführt werden kann, bedeutet das nur, dass die Bearbeitung unabhängig von der Aufzählungsreihenfolge ist. --------------- Zitat:
|
AW: For xx In xxx Schleife rückwärts?
Zitat:
Anderes Beispiel:
Delphi-Quellcode:
Preisfrage: In welcher Reihenfolge werden die Elemente ausgegeben? :lol:
MyList.Add(1);
MyList.Add(3); MyList.Add(2); For element in MyList do Writeln(element); |
AW: For xx In xxx Schleife rückwärts?
Zitat:
Zitat:
Code:
Eine andere Reihenfolge ist ein Fehler.
1
3 2 |
AW: For xx In xxx Schleife rückwärts?
Zitat:
Delphi-Quellcode:
Das heißt es ist auch ein Fehler, dass dort nicht Eins, Zwei, Drei herauskommt?
var
Test: TDictionary<Integer, String>; Current: TPair<Integer, String>; begin Test := TDictionary<Integer, String>.Create; try Test.Add(1, 'Eins'); Test.Add(2, 'Zwei'); Test.Add(3, 'Drei'); for Current in Test do ShowMessage(Current.Value); finally Test.Free; end; end; for..in heißt nur "gehe alle Elemente durch". Nicht mehr und nicht weniger. |
AW: For xx In xxx Schleife rückwärts?
Zitat:
Die For-in-Schleife geht alle Elemente einer Aufzählung durch. Und das Aufzählen einer Liste geschieht von vorn nach hinten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz