ArrayList未返回预期结果

时间:2017-07-10 12:39:27

标签: powershell

为什么这段代码不起作用?

$method = {
    [System.Collections.ArrayList]$array;
    for ($i=0; $i -le 50; $i++) { $array += $i }
}

使用以下命令执行scriptblock:

&$method

在控制台上显示:

1, 2, 3, 4, 5, 6

何时应打印50个数字?

2 个答案:

答案 0 :(得分:0)

ArrayList类型的Add() method会发出插入新项目的索引。将表达式转换为[void],将其传递给Out-Null或将其分配给$null以压缩此输出:

[void]$array.Add($i)
# or
$array.Add($i) |Out-Null
# or
$null = $array.Add($i)

如果多次这样做,请避免管道Out-Null,铸造或分配要比管道快得多。

答案 1 :(得分:0)

您发布的代码根本不应生成任何输出,除非您已在父作用域中定义了变量$array。声明

[System.Collections.ArrayList]$array

将变量$array的值转换为类型ArrayList并回显它。如果变量在父作用域中具有值,则语句将输出值作为数组列表,否则输出将为null。后续循环不会使用该变量,而是增加一个新的(本地)变量$array。您可以通过在脚本块的末尾放置一个语句$array.GetType().FullName来验证这一点。您可能会得到System.Int32,而不是System.Collections.ArrayList(或System.Object[])。

如果要实例化ArrayList对象,向其添加数字,并在脚本块的末尾输出该列表,则需要将代码更改为以下内容:

$method = {
    [Collections.ArrayList]$array = @()
    for ($i=0; $i -le 50; $i++) { $array += $i }
    $array
}

请注意第一个语句中的赋值操作。

演示:

PS C:\> $sb = { [Collections.ArrayList]$a; 0..50 | % { $a += $_ }; $a.GetType().FullName; $a }
PS C:\> &$sb
System.Int32
1275
PS C:\> $sb = { [Collections.ArrayList]$a = @(); 0..50 | % { $a += $_ }; $a.GetType().FullName; $a }
PS C:\> &$sb
System.Collections.ArrayList
0
1
...
49
50