Wie um zu überprüfen, ob ein dynamisches array ist leer
Habe ich ein Verfahren erklärt, zum Beispiel so:
procedure MyProc(List: Array of string);
Möchte ich wissen, wie um zu prüfen, ob die List
parameter leer ist.
Beispiel:
procedure MyProc(List: Array of string);
begin
if List=[] then // here I want to check if the List array is empty
//do something
else
//do something else
end;
Wie kann ich das machen?
- Sie sollten geschrieben haben
MyProc(const List: array of string)
weil in deinem code, alle strings kopiert werden, in ein temporäres array vor dem Aufruf derMyProc
Verfahren. Undif pointer(List)=nil then
ist der Schnellste Weg, um zu überprüfen, dass ein dynamisches array ist leer. pointer(list)
aufgibt Typ-Sicherheit und verlässt sich auf die Umsetzung detail
Du musst angemeldet sein, um einen Kommentar abzugeben.
können Sie die
Length
FunktionLeere arrays sind gleich
nil
:(Das bedeutet auch, dass
SetLength(List, 0)
undList := nil
sind entsprechende Befehle.)Leere arrays haben eine Letzte index, der kleiner als der erste index, der für die öffne array in deinem Beispiel bedeutet, dass eine negative last-index:
Das bedeutet, dass, wenn Sie möchten, vermeiden Sie die Ausführung einer Schleife auf ein leeres array, das Sie nicht haben, etwas besonderes zu tun. Schreiben Sie einfach die Schleife, wie Sie normalerweise würden:
if List = nil then
? diese Zeile nicht compiliert wird.if pointer(List)=nil then
ist der Schnellste Weg, um zu überprüfen, dass ein dynamisches array ist leer (Schnellste alslength(List)=0
)List = nil
funktioniert nur fürdynamic arrays
(wie im Titel dieser Frage), aber nicht füropen arrays
(wie in dem Beispiel zu dieser Frage). Das poster wird die Vermischung von dynamischen und offenen arrays.Assigned(List)
oder anderen variation auf das Thema um zu überprüfen, ob ein array ist leer. Vergleichen Sie zum Beispiel dieTList
Klasse. Es gibt eine deutlich unterschiedliche Bedeutung zwischenMyTList = nil
undMyTList.Count = 0
. So viel wie, dass etwas nicht existiert, kann nicht haben alle Elemente, die - die Tatsache, dass es nicht existieren ein bedeutender - Fehler. Also ich würd lieber mitLength(List)
- oder noch besserfor I := Low(List) to High(List)
mit dem Vorteil, dass es das gleiche für alle drei Arten von arrays. (+1 anycase für: "wird nicht ausgeführt, wenn die Liste leer ist")Persönlich Schreibe ich immer
eher als
weil ich glaube, es liest sich besser, und das nicht nur für dynamische arrays.
Antwort auf die Frage, für dynamische arrays, aber dein Beispiel ist ein öffnen array, so gibt es zwei mögliche Fragen finden Sie hier.
Für offene arrays, die ich benutzen würde
Length()
oderhigh()
zu nehmen Entscheidung auf der Grundlage der Größe des Arrays. Ich würde nicht verführt werden durch Argumente, diePointer(List)<>nil
ist schneller alsLength(List)<>nil
. Der Unterschied in der Geschwindigkeit zwischen diesen Optionen wird nicht erkennbar sein, und deshalb sollten Sie am häufigsten verwenden, klare und lesbare option.Assigned(List)
oder anderen variation auf das Thema um zu überprüfen, ob ein array ist leer. Vergleichen Sie zum Beispiel dieTList
Klasse. Es gibt eine deutlich unterschiedliche Bedeutung zwischenMyTList = nil
undMyTList.Count = 0
. So viel wie, dass etwas nicht existiert, kann nicht haben alle Elemente, die - die Tatsache, dass es nicht existieren ein bedeutender - Fehler. Also ich würd lieber mitLength(List)
- oder noch besserfor I := Low(List) to High(List)
mit dem Vorteil, dass es das gleiche für alle drei Arten von arrays.