Einzelnen Beitrag anzeigen

Der schöne Günther

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

AW: TArray - Alternative zu SetLength(..) ?

  Alt 25. Feb 2014, 10:37
Ich möchte eine Liste anlegen. Beispielsweise die Standard RTL-Liste System.Generics.Collections.TList . Oder eine Spring.Collections.IList .

Diese Liste soll vom Start weg 20 Einträge haben. Booleans, Floats, irgendwas.

Das sieht dann so aus
Delphi-Quellcode:
uses System.Generics.Collections;
const
   numItems:       Integer =   20;
   stdItemValue:    Integer =   0;
var
   myList: TList<Integer>;
   itemNo: Integer;
begin
   myList := TList<Integer>.Create();
   
   for itemNo := 0 to Pred(numItems) do
      myList.Add(stdItemValue);
      
end;
Ich denke, das geht besser. Einer Liste kann man bspw. schön sagen "Füge alle Einträge dieses Arrays hinzu":

Delphi-Quellcode:
uses System.Generics.Collections;
const
   numItems:    Integer = 20;
   stdItemValue: Integer = 0;
var
   myArray:   TArray<Integer>;
   myList: TList<Integer>;

   itemNo:    Integer;
begin

   // Array erstellen und füllen
   myArray := TArray<Integer>.Create();
   SetLength(myArray, numItems);

   for itemNo := 0 to Pred(numItems) do
      myArray[itemNo] := stdItemValue;

   // Liste aus Array erstellen
   myList := TList<Integer>.Create();
   myList.AddRange(myArray);

   // Mit Spring.Collections.IList ginge auch
   // myList := TCollections.CreateList<Integer>(myArray);

end;
Und ich habe das Gefühl, in der Richtung lässt sich das arg zusammenkürzen. Wenn absolut feststeht, dass es immer fünf Elemente sind, kann ich, dank TArray<> ja schon den hier machen:

myList.AddRange( TArray<Integer>.Create(0, 0, 0, 0, 0) ); .

Ich hätte jetzt gerne eine Art TArray<Integer>.Create(elementCount: Integer) .


Die erste Idee war, einfach einen Record Helper für [Delphi]TArray<T>[/Delphi zu basteln, aber Helferklassen dürfen anscheinend nicht generisch sein.

Während ich das hier tippe fiel mir die nie genutzte, nicht generische Klasse TArray aus System.Generics.Collections ein:
Wenn ich mir eine winzige Helferklasse mit
Delphi-Quellcode:
   TArrayHelper = class helper for System.Generics.Collections.TArray
      class function CreateArray<T>(const itemCount: Integer): TArray<T>;
   end;
baue kann ich eigentlich schon relativ zufrieden sein. Jetzt kann ich einfach sagen

myList.AddRange( TArray.CreateArray<Integer>(12345) ); bzw.

myList := TCollections.CreateList<Integer>( TArray.CreateArray<Integer>(5) ); Genau das wollte ich. Auch wenn es schon an den Rand des noch komfortabel lesbaren kommt.

Geändert von Der schöne Günther (25. Feb 2014 um 10:42 Uhr)
  Mit Zitat antworten Zitat