从函数返回多维数组

5
我在将现有的vbs脚本转换为PowerShell脚本时遇到了一些问题。 我已经用一些虚拟代码来说明这个问题,而不是我的原始代码。 在示例1中,我只有一个元素集合的数组,在将数组变量返回给函数后,它只会显示P。
然而,在示例2中,当我有两组元素时,在将数组变量返回给函数后,它将正确地显示元素。
如果你在示例1和2中的函数内打印数组,获取结果时没有任何问题。
我已经搜索过谷歌,但没有找到任何解决方案。非常感谢您的帮助。 示例1:
function testArray {
    $array1 = @()
    $array1 += ,@("Apple","Banana")

    return $array1
}
$array2 = testArray
Write-Host $array2[0][1]

结果为 "P"。 示例2:
function testArray {
    $array1 = @()
    $array1 += ,@("Apple","Banana")
    $array1 += ,@("Orange","Pineapple")

    return $array1
}
$array2 = testArray
Write-Host $array2[0][0]

结果是“苹果”。


4
return $array1 翻译为 return ,$array1,意思是在返回 $array1 时将其转换为一个仅包含该数组的元素的数组。$array2 = testArray 翻译为 $array2 = @(testArray),意思是将 testArray 转换为一个数组,如果 testArray 已经是一个数组,则不做任何更改。 - user4003407
@petseral 这个可以工作,有任何原因吗?还是只是 Powershell 的语法? - Benjamin TAN
3
PowerShell会展开从函数返回的数组。通过在返回的数组前面添加数组构造运算符(,),您将其包装在另一个数组中,该数组在返回时被展开,同时保留嵌套的数组不变。 - Ansgar Wiechers
这是一个重复的问题吗?我肯定在这里以前已经有人问过了。无论如何,这是我第一次遇到这个问题,很感激我遇到了它。向你们致敬。 - gravity
3个回答

9

PowerShell会展开从函数返回的数组。在返回的数组前面加上逗号运算符,,一元数组构造运算符)以将其包装在另一个数组中,在返回时展开该数组,保留嵌套的数组不变。

function testArray {
    $array1 = @()
    $array1 += ,@("Apple","Banana")

    return ,$array1
}

1
Write-Output -NoEnumerate $array1怎么样? - wOxxOm
它有什么优势,相比于 return ,$array1 或者只是 ,$array1 - Ansgar Wiechers
大概的优点是它不会创建额外的数组。缺点是太啰嗦且输入过长。 - wOxxOm
我认为创建一个带有单个嵌套数组引用的数组的开销可以忽略不计。 - Ansgar Wiechers
@wOxxOm 大概的优点是它不会创建额外的数组。 不是真的。它同样会创建额外的数组。 - user4003407

1

当你声明单行数组时,如下所示:

$array1 = "Apple","Banana"

when you call :

$array1[0][1]

这将发生:

enter image description here

这段代码
function testArray {
    $array1 = @()
    $array1 += ,@("Apple","Banana")

    return $array1
}
$array2 = testArray
Write-Host $array2[0][1]

精确相同于此:

$array1 = "Apple","Banana"

但是当你声明一个包含两行的数组时,例如:
function testArray {
    $array1 = @()
    $array1 += ,@("Apple","Banana")
    $array1 += ,@("Orange","Pineapple")

    return $array1
}
$array2 = testArray
Write-Host $array2[0][0]

this will happen :

enter image description here

如果你需要在第一行代码中使用苹果,只需调用array[0]而不是array[0][0]。array[0][0]会返回一个字符。抱歉我的英语不好,希望你能理解。

0

你的函数TestArray中的$array1始终是一维的、固定的,并且从未有过类型为数组的元素。请检查如何在数组上定义加法运算符。

在这种情况下,您要使用ArrayList:$array1=[Collections.ArrayList] :: new(10) # 10是容量 之后,您可以使用Add函数。甚至与数组一起使用。而且这次它们不会被展平,就像+数组运算符的情况一样。 还存在其他动态集合类型。但是对于许多目的,这个看起来很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接