AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TArray - Alternative zu SetLength(..) ?

Ein Thema von Der schöne Günther · begonnen am 24. Feb 2014 · letzter Beitrag vom 3. Mär 2020
Antwort Antwort
Seite 1 von 3  1 23      
Der schöne Günther

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

TArray - Alternative zu SetLength(..) ?

  Alt 24. Feb 2014, 18:56
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:
var
   myArray: TArray<Boolean>;
begin
   myArray := TArray<Boolean>.Create();
   SetLength(myArray, 5);
   [...]
end
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.

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:
uses Spring.Collections;
var
   myBooleanList: IList<Boolean>;
begin
   myBooleanList := TCollections.CreateList<Boolean>(
      TArray<Boolean>.Create(False, False, False, False, False)
   );
end;
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 SetLength(..) macht- Also nur die Anzahl der mit Default-Wert initialisierten Elemente entgegennimmt.

Gibt es da was feines?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.006 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 25. Feb 2014, 00:19
Bei einem TArray<T> brauchst du den Konstruktor doch gar nicht:

Delphi-Quellcode:
var
   myArray: TArray<Boolean>;
begin
   SetLength(myArray, 5);
   [...]
end
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#3

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

  Alt 25. Feb 2014, 09:12
Jeder vernünftige Mensch geht, bei bspw. fünf Stellen hin und sagt
Delphi-Quellcode:
var
   myArray: TArray<Boolean>;
begin
   myArray := TArray<Boolean>.Create();
   SetLength(myArray, 5);
   [...]
end
[/Delphi]
Jeder vernünftige Mensch... LOL

wir wäre es mit

Delphi-Quellcode:
var
   MyArray : Array[0..4] of Boolean;
Ich dachte so machen das vernünftige Menschen...

OK Spass beiseite.

Kannst Du mal erklären wofür und was Du vor hast?

Mavarik
  Mit Zitat antworten Zitat
Der schöne Günther

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

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

  Alt 25. Feb 2014, 09: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 09:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

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

  Alt 25. Feb 2014, 09:39
... dass ich gerne eine Kollektion (wie eine Liste) hätte
Collections braucht man in Delphi nur, wenn man die Collection im Objektinspektor editieren möchte (oder den Persistenzmechanismus von Delphi ausnützen möchte).
Damit ist das Anwendungsgebiet von Collections die Komponentenentwicklung.

Um eine hohe Anzahl von Booleans speichersparend zu verwalten eignet sich die Klasse TBits.
fork me on Github
  Mit Zitat antworten Zitat
Der schöne Günther

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

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

  Alt 25. Feb 2014, 13:23
Ich habe weder eine "hohe Anzahl", noch muss ich dringend Speicher sparen. Ist doch nicht verboten, seine Booleans in eine Liste zu packen?
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#7

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

  Alt 25. Feb 2014, 15:18
Delphi-Quellcode:
Const
  MyList : Array [0..4] Of Boolean = (false,true,false,true,false);
Ist zwar nur ein Array, aber immerhin.
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#8

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

  Alt 25. Feb 2014, 15:51
Zitat:
Ich hätte jetzt gerne eine Art TArray<Integer>.Create(elementCount: Integer) .
Dann schreib dir doch so einen Klasse.

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;
??
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 25. Feb 2014, 16:55
Ich möchte ein Array erstellen, und das soll bitte x Stellen breit sein.

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.
Du möchtest "reservieren"?
Delphi-Quellcode:
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;
Aus dem Debugger:
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)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#10

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

  Alt 25. Feb 2014, 17:20
Günthers lustige Ratestunde.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz