2012-10-12 9 views
7

Wie arbeiten Sie mit Arrays dynamischer Länge (ArrayLists/Lists) in Powershell? Ich möchte grundsätzlich ein 2D-Array, bei dem die Länge des äußersten Index unbekannt ist.Wie bearbeite ich ein Array mit unbekannter Länge in Powershell?

Ich habe versucht, ein Array mit $array = @() zu initialisieren, aber würde Index außerhalb der Bereichsausnahmen erhalten, wenn man irgendetwas in diesem anspricht. Dann habe ich versucht, den Operanden + = zu verwenden, wie ich in einem Artikel gelesen habe, aber das würde zu einer Verkettung von Strings führen und nicht zu einer Elementaddition.

Beispiel:

$array = @() 
$array += @("Elem1x", "Elem1y") 
$array += @("Elem2x", "Elem2y") 
Echo $array[0][0] 

Output: "E" anstelle von "Elem1x";

Antwort

8

Versuchen Sie, diese Art und Weise:

$array = @() 
$array += ,@("Elem1x", "Elem1y") 
$array += ,@("Elem2x", "Elem2y") 
$array[0][0] 
+0

Habe meine Antwort bearbeitet, weil ich einen großen Fehler hatte! –

+0

Kann jemand erklären, was das Komma eigentlich macht? – Nilzor

+0

@Nilzor lesen Sie hier: http://blogs.msdn.com/b/powershell/archive/2007/01/23/array-literals-in-powershell.aspx –

9

Christian Antwort der Powershell-Weg zu gehen und funktioniert gut für die meisten Fälle (kleine bis mittelgroße Arrays). Wenn Ihr Array groß ist, sollten Sie ArrayList aus Performance-Gründen in Betracht ziehen. Das heißt, jedes Mal, wenn Sie += mit einem Array verwenden, muss PowerShell ein neues Array erstellen und den alten Inhalt in das neue Array kopieren und das neue Array der Variablen zuweisen. Das liegt daran, dass .NET-Arrays eine feste Größe haben. Hier ist, wie Sie dies mit einem Arraylist tun könnten:

$list = new-object system.collections.arraylist 
$list.Add(("Elem1x", "Elem1y", "Elem1z")) > $null 
$list.Add(("Elem2x", "Elem2y")) > $null 
$list[0][0] 

BTW, was der Betreiber += tut, hängt von der Art des Objekts auf der linken Seite des Operators. Wenn es sich um einen String handelt, erhalten Sie eine String-Verkettung. Wenn das Objekt ein Array ist, wird die rechte Seite an das Array angehängt (über create new array/copy).

+1

Ich werde auch hinzufügen, dass in meiner Erfahrung ein multidimensionales Array ist fast immer schlechter als irgendeine andere Datenstruktur, wie hier eine Arraylist von Arrays vorgeschlagen. Aber ich kann nur voreingenommen gegen multidimensionale Arrays sein :) – EBGreen

Verwandte Themen