2012-10-12 14 views
7

Come si lavora con array di lunghezza dinamica (elenchi di array/elenchi) in PowerShell? Fondamentalmente voglio un array 2D in cui la lunghezza dell'indice più esterno sia sconosciuta.Come si popola una matrice di lunghezza sconosciuta in PowerShell?

Ho provato a inizializzare un array con $array = @(), ma otterrei l'indice fuori dalle eccezioni di intervallo quando mi riferisco a qualcosa in questo. Poi ho provato a utilizzare l'operando + =, come ho letto in un articolo, ma ciò risulterebbe in concatenazione di stringhe e non aggiunta di elementi.

Esempio:

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

uscita: "E" invece di "Elem1x";

risposta

8

provare in questo modo:

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

Ho modificato la mia risposta perché ero in un grosso errore! –

+0

Qualcuno può spiegare cosa fa effettivamente la virgola? – Nilzor

+0

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

9

risposta di Christian è il modo PowerShell per andare a grandi opere per la maggior parte dei casi (piccole per gli array di medie dimensioni). Se l'array è di grandi dimensioni, è consigliabile prendere in considerazione l'utilizzo di ArrayList per motivi di prestazioni. Cioè, ogni volta che si utilizza += con un array, PowerShell deve creare un nuovo array e copiare i vecchi contenuti nel nuovo array e assegnare il nuovo array alla variabile. Questo perché gli array .NET sono di dimensioni fisse. Ecco come si potrebbe fare questo usando un ArrayList:

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

BTW che cosa l'operatore += fa dipende dal tipo di oggetto sul lato sinistro dell'operatore. Se si tratta di una stringa, si ottiene una concatenazione di stringhe. Se l'oggetto è un array, il lato destro viene aggiunto all'array (tramite la creazione di un nuovo array/copia).

+1

Aggiungerò anche che nella mia esperienza, un multidimensionale l'array è quasi sempre inferiore ad altre strutture di dati come suggerito qui un arraylist di array. Ma potrei essere solo prevenuto contro gli array multidimensionali :) – EBGreen

Problemi correlati