Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   spring4d: TList<T> in IList<T> konvertieren (https://www.delphipraxis.net/197614-spring4d-tlist-t-ilist-t-konvertieren.html)

hschmid67 22. Aug 2018 07:54

spring4d: TList<T> in IList<T> konvertieren
 
Hallo zusammen,

vielleicht übersehe ich ja etwas ganz Einfaches, aber ich finde keine Funktion oder auch einen Hinweis dazu im Internet:

Ich habe aus einem Framework, das ich nicht selbst im Griff habe (TMS Aurelius), immer wieder Listen im Format TList<T>. Wie kann ich diese in ihr entsprechendes Gegenüber aus spring4d konvertieren, sodass ich dann ein IList<T> habe? Geht das irgendwie "einfach" oder muss ich alle Items in eine neu erzeugte IList hinzufügen?

Viele Grüße
Harald

Der schöne Günther 22. Aug 2018 08:30

AW: spring4d: TList<T> in IList<T> konvertieren
 
Delphi-Quellcode:
System.Generics.TList<T>
implementiert
Delphi-Quellcode:
Spring.Collections.IList<T>
nicht, es implementiert leider überhaupt keine Interfaces.

Dir bleibt nichts anderes übrig als es in eine neue Liste zu übertragen (mache ich auch immer so)


Delphi-Quellcode:
procedure p();
var
   rtlList:   TList<Byte>;
   springList:   IList<Byte>;
begin
   rtlList := TList<Byte>.Create();
   springList := TCollections.CreateList<Byte>( rtlList.ToArray() );
end;

hschmid67 22. Aug 2018 08:59

AW: spring4d: TList<T> in IList<T> konvertieren
 
Hallo Günther,

vielen Dank! Das mit dem Argument beim CreateList<T>(Argument) udn dem T.ToArray wußte ich noch nicht. Super, damit kann ich dann alles auf einen Schwung übertragen und muss nicht einzeln jedes Element hinzufügen.

Muss ich denn die TList<T> wieder freigeben, auch die einzelnen Objekte, oder macht das das Interface dann selbst. Anders gefragt, werden die übergebenen Werte kopiert (vermutlich nicht), oder nur die Zeiger übergeben? Dann müsste ich nur TList freigeben und nicht alle Objekte... Stimmt das so? Es würde also so reichen:

Delphi-Quellcode:
procedure p();
var
   rtlList:  TList<Byte>;
   springList:  IList<Byte>;
begin
   rtlList := TList<Byte>.Create();
   springList := TCollections.CreateList<Byte>( rtlList.ToArray() );
   rtlList.Free;
end;
Viele Grüße
Harald

Der schöne Günther 22. Aug 2018 09:09

AW: spring4d: TList<T> in IList<T> konvertieren
 
Das kommt jetzt natürlich darauf an ob du eine Liste von Wertetypen (Bytes, Records, Integers, …) oder nicht gemanagten Referenztypen (TObject) hast.

Die TList<T> welche du aus deiner Bibliothek zurückbekommst wirst du, davon gehe ich mal aus, am besten direkt freigeben. Schau lieber noch einmal in passende Doku von "TMS Aurelius".

Stecken in der Liste jetzt Objekte wirst du die natürlich auch irgendwann freigeben müssen. Es sei denn, du nimmst aus Spring nicht die IList<T> sondern die IObjectList<T> (und dementsprechend
Delphi-Quellcode:
TCollections.CreateObjectList<T>(..)
nimmst). Die räumt die enthaltenen Objekte auch gleich mit ab wenn man sie freigibt.

hschmid67 22. Aug 2018 10:07

AW: spring4d: TList<T> in IList<T> konvertieren
 
Vielen Dank - das hat mir alles sehr viel weiter geholfen :-) und ich hab wieder was bzgl. generische Listen gelernt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf