【发布时间】:2020-08-16 17:17:54
【问题描述】:
给定一个正确定义的变量
$test = New-Object System.Collections.ArrayList
.Add 用数组中的项目数污染管道,而.AddRange 不会。
$test.Add('Single') 会将计数转储到控制台。 $test.AddRange(@('Single2')) 将毫不费力地清理干净。为什么会有不同的行为?这只是一个疏忽,还是有一些我不理解的故意行为?
鉴于.AddRange 需要在不使用变量时强制转换为数组(这已经是一个数组),当我知道我只需要添加一项时,我倾向于使用[void]$variable.Add('String'),当我知道我只需要添加一项时使用[void]$test.AddRange($variable)我正在向数组中添加一个数组,即使 $variable 仅包含或只能包含单个项目。 [void] 这里不是必需的,但我想知道拥有它是否只是最佳实践,当然取决于上面的答案。还是我也错过了什么?
【问题讨论】:
-
这能回答你的问题吗? Return Multidimensional Array From Function:
$test.Add(,@('Single')) -
"添加污染管道",不完全正确,你在输出的时候把项目放在管道上(默认:
Write-Output) 对象 ($Test)。 -
我想我的问题与为什么不同?为什么
.Add将计数转储到管道而.AddRange没有?如果我想知道添加一项后得到的数组有多大,那么在添加 N 项后我是否也想知道(甚至更多)?真的,我什么时候想知道管道?我总是可以得到.Count。至于这与展开行为有什么关系,我看不出有什么联系,但对我来说现在也是早上,我还在喝第一杯咖啡,所以我可能会再看一下,看看是否有什么开始有意义. -
而且,关于污染,我从来没有真正输出过
$test。当我这样做时,我期望$test的内容。但是$variable.Add('String')不是输出,它只是在修改,在控制台返回1对我来说似乎是污染。 -
这整个讨论可以避免,因为
arralylist类型已被弃用 - 并且已经被弃用了好几年。 [grin] 所以......不要使用它。相反,使用类似generic.list类型的东西。不会发出添加项目的索引。另外,它的速度非常快。
标签: powershell arraylist pipeline