Gibt es in Delphi eine foreach-generische Methode, die mit anonymer Funktion aufgerufen werden kann?

11

Ich kann folgendes in C ++ machen

%Vor%

Ich möchte das Gleiche / Ähnliches in Delphi machen. Ich habe früher eine Frage für C ++ - Entwickler gestellt wollte ähnliches Beispiel in OOP Pascal produzieren. Der Lambda (anonyme Methode) Teil der Frage ist nicht wirklich relevant, aber ich frage mich, ob ich das gleiche in Delphi XE2 machen könnte.

Ich frage, weil ich XE habe, und ich bin mir nicht sicher, ob es hinzugefügt wurde. Danke.

    
Mihaela 09.03.2012, 18:06
quelle

1 Antwort

8

Wahrscheinlich ist das nächste Delphi-Analog zu std::vector<T> TList<T> . Sie können die Liste mit einer for in Schleife durchlaufen:

%Vor%

Wenn Sie ein dynamisches Array anstelle von TList<T> haben, können Sie for in verwenden, um über die Elemente zu iterieren. Tatsächlich unterstützen alle eingebauten Container for in und es ist einfach, Unterstützung für for in zu Ihren eigenen Klassen hinzuzufügen.

In C ++ gibt es nichts wie eine for in -Schleife und daher ist es ein Idiom, einen STL-Algorithmus zu verwenden. Das bringt Sie dazu, eine anonyme Funktion zu verwenden. In Delphi mit der for in -Syntax können Sie "iterieren über alle Mitglieder des Containers" auf natürliche Weise ausdrücken, ohne auf anonyme Methoden zurückgreifen zu müssen.

Generics wurden zu Delphi in Delphi 2009 hinzugefügt und die for in -Schleife wurde in Delphi 2005 hinzugefügt, sodass Ihnen all dies in XE zur Verfügung steht. Für was es wert ist, wurden auch anonyme in Delphi 2009 hinzugefügt.

Was Sie wissen müssen, ist, dass Delphi-Generika weniger leistungsfähig sind als C ++ - Vorlagen. Obwohl Sie von einem generischen foreach sprechen, ist Ihr Code nicht generisch in dem Sinne, dass er auf int spezialisiert ist. Sie könnten eine generische Version Ihres Codes in C ++ schreiben, aber dies wäre aufgrund der inhärenten Einschränkungen von Generika im Vergleich zu Templates viel schwieriger mit Delphi-Generika zu machen. Ein Versuch, den obigen Code in Delphi generisch zu schreiben, würde an dem Punkt beginnen, an dem Sie versucht haben, Writeln aufzurufen. Während das mit C ++ - Vorlagen trivial wäre, ist es für Generika frustrierend unerreichbar.

Update: In den Kommentaren fragen Sie, ob es eine glatte Möglichkeit gibt, den Inhalt eines Containers einem anderen hinzuzufügen. Die Methode AddRange erledigt dies. TList<T>.AddRange() hat drei überladene Varianten, die einen der folgenden Eingabeparameter erhalten: array of T , Collection: IEnumerable<T> oder Collection: TEnumerable<T> . Alle standardmäßigen generischen Container folgen einem ähnlichen Muster.

    
David Heffernan 09.03.2012 18:27
quelle