2012-10-12 38 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

相关问题