![]() |
TArray - Alternative zu SetLength(..) ?
Ich möchte ein Array erstellen, und das soll bitte x Stellen breit sein. Jeder vernünftige Mensch geht, bei bspw. fünf Stellen hin und sagt
Delphi-Quellcode:
Meine Motivation ist, dass ich gerne eine Kollektion (wie eine Liste) hätte, und die soll bitte direkt vom Start weg eine bestimmte Länge haben. Ja, man kann hingehen, und nacheinander die beliebige Menge an Elementen hinzufügen.
var
myArray: TArray<Boolean>; begin myArray := TArray<Boolean>.Create(); SetLength(myArray, 5); [...] end Wäre es nicht viel eleganter, wenn man "anonym" ein Array mit gleich einer bestimmten Länge erzeugen kann und das Parameter für dem Copy-Konstruktor nimmt?
Delphi-Quellcode:
Das ist schon nahe dran, allerdings muss ich hier die Elemente im Array alle einzeln auflisten. Ich suche also im Endeffekt einen "Konstruktor" für ein Array das mich nicht die Elemente einzeln auflisten lässt, sondern im Endeffekt nur ein
uses Spring.Collections;
var myBooleanList: IList<Boolean>; begin myBooleanList := TCollections.CreateList<Boolean>( TArray<Boolean>.Create(False, False, False, False, False) ); end;
Delphi-Quellcode:
macht- Also nur die Anzahl der mit Default-Wert initialisierten Elemente entgegennimmt.
SetLength(..)
Gibt es da was feines? |
AW: TArray - Alternative zu SetLength(..) ?
Bei einem TArray<T> brauchst du den Konstruktor doch gar nicht:
Delphi-Quellcode:
var
myArray: TArray<Boolean>; begin SetLength(myArray, 5); [...] end |
AW: TArray - Alternative zu SetLength(..) ?
Zitat:
wir wäre es mit
Delphi-Quellcode:
Ich dachte so machen das vernünftige Menschen... :stupid:
var
MyArray : Array[0..4] of Boolean; OK Spass beiseite. Kannst Du mal erklären wofür und was Du vor hast? Mavarik |
AW: TArray - Alternative zu SetLength(..) ?
Ich möchte eine Liste anlegen. Beispielsweise die Standard RTL-Liste
Delphi-Quellcode:
. Oder eine
System.Generics.Collections.TList
Delphi-Quellcode:
.
Spring.Collections.IList
Diese Liste soll vom Start weg 20 Einträge haben. Booleans, Floats, irgendwas. Das sieht dann so aus
Delphi-Quellcode:
Ich denke, das geht besser. Einer Liste kann man bspw. schön sagen "Füge alle Einträge dieses Arrays hinzu":
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;
Delphi-Quellcode:
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
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;
Delphi-Quellcode:
ja schon den hier machen:
TArray<>
Delphi-Quellcode:
.
myList.AddRange( TArray<Integer>.Create(0, 0, 0, 0, 0) );
Ich hätte jetzt gerne eine Art
Delphi-Quellcode:
.
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
Delphi-Quellcode:
aus
TArray
Delphi-Quellcode:
ein:
System.Generics.Collections
Wenn ich mir eine winzige Helferklasse mit
Delphi-Quellcode:
baue kann ich eigentlich schon relativ zufrieden sein. Jetzt kann ich einfach sagen
TArrayHelper = class helper for System.Generics.Collections.TArray
class function CreateArray<T>(const itemCount: Integer): TArray<T>; end;
Delphi-Quellcode:
bzw.
myList.AddRange( TArray.CreateArray<Integer>(12345) );
Delphi-Quellcode:
Genau das wollte ich. Auch wenn es schon an den Rand des noch komfortabel lesbaren kommt.
myList := TCollections.CreateList<Integer>( TArray.CreateArray<Integer>(5) );
|
AW: TArray - Alternative zu SetLength(..) ?
Zitat:
Damit ist das Anwendungsgebiet von Collections die Komponentenentwicklung. Um eine hohe Anzahl von Booleans speichersparend zu verwalten eignet sich die Klasse TBits. |
AW: TArray - Alternative zu SetLength(..) ?
Ich habe weder eine "hohe Anzahl", noch muss ich dringend Speicher sparen. Ist doch nicht verboten, seine Booleans in eine Liste zu packen?
|
AW: TArray - Alternative zu SetLength(..) ?
Delphi-Quellcode:
Ist zwar nur ein Array, aber immerhin.
Const
MyList : Array [0..4] Of Boolean = (false,true,false,true,false); |
AW: TArray - Alternative zu SetLength(..) ?
Zitat:
Delphi-Quellcode:
??
uses System.Generics.Collections;
TMyList<T> = class TList<T> ... constructor Create(T...; Elements : Integer) begin inherited Create(T...); for itemNo := 0 to Pred(Elements) do Add(X); end; |
AW: TArray - Alternative zu SetLength(..) ?
Zitat:
Delphi-Quellcode:
Aus dem Debugger:
var
MyList : TList<Boolean>; begin MyList := TList<Boolean>.Create; MyList.Capacity := 20; // jetzt sind 20 Elemente drin, in diesem Fall ist der Wert der Items gleich false MyList.Free; end;
Code:
MyList ((False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False), 0, Pointer($666A2C) as {System.Generics.Defaults}IComparer<System.Boolean>, (nil,nil), $2A42880)
|
AW: TArray - Alternative zu SetLength(..) ?
Günthers lustige Ratestunde.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:17 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 by Thomas Breitkreuz