2012-10-12 73 views
7

如何與在PowerShell中動態長度的數組(的ArrayList /列表)工作?我基本上想要一個2D數組,其中最外層索引的長度是未知的。如何填充未知長度的PowerShell中的數組?

我試圖初始化數組$array = @(),但解決這個事情的時候會得到索引超出範圍異常。然後我嘗試使用+ =操作數,正如我在文章中讀到的那樣,但這會導致字符串連接而不是元素添加。

實施例:

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

輸出: 「E」,而不是 「Elem1x」;

回答

8

試試這個方法:

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

已經編輯我的答案,因爲我是一個很大的錯誤! –

+0

任何人都可以解釋逗號實際上做了什麼嗎? – Nilzor

+0

@Nilzor在這裏閱讀:http://blogs.msdn.com/b/powershell/archive/2007/01/23/array-literals-in-powershell.aspx –

9

基督教的答案是PowerShell的路要走偉大工程在大多數情況下(小到中等大小的數組)。如果你的數組很大,那麼你可能想考慮使用ArrayList的性能原因。也就是說,每次使用+=使用數組時,PowerShell提供了創建一個新的陣列和舊的內容複製到新陣列,並指定新的數組變量。這是因爲.NET數組的大小是固定的。這裏是你如何能做到這一點使用一個ArrayList:

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

BTW什麼操作+=不取決於物體對操作人員的左側的類型。如果它是一個字符串,那麼你會得到字符串連接。如果該對象是一個數組,則將右側附加到數組(通過創建新數組/複製)。

+1

我也補充一點,在我的經驗,一多維數組幾乎總是比其他數據結構更差,比如這裏提出的數組數組結構列表。但我可能會對多維數組產生偏見:) – EBGreen

相關問題