Collections PowerShell中的平坦阵列
假设我们有:Collections PowerShell中的平坦阵列,collections,powershell,Collections,Powershell,假设我们有: $a = @(1, @(2, @(3))) 我想展平$a以获得@(1,2,3) 我发现: 但也许有一种更优雅的方式?管道是展平嵌套结构的正确方式,所以我不确定什么更“优雅”。是的,语法看起来有点混乱,但坦率地说相当有用 2020年编辑 现在推荐的语法是将%扩展到ForEach对象。更详细一点,但更具可读性: @($a | ForEach-Object {$_}).count 相同的代码,只是包装在函数中: function Flatten($a) { ,@($a | %
$a = @(1, @(2, @(3)))
我想展平$a
以获得@(1,2,3)
我发现:
但也许有一种更优雅的方式?管道是展平嵌套结构的正确方式,所以我不确定什么更“优雅”。是的,语法看起来有点混乱,但坦率地说相当有用 2020年编辑 现在推荐的语法是将
%
扩展到ForEach对象
。更详细一点,但更具可读性:
@($a | ForEach-Object {$_}).count
相同的代码,只是包装在函数中:
function Flatten($a)
{
,@($a | % {$_})
}
测试:
function AssertLength($expectedLength, $arr)
{
if($ExpectedLength -eq $arr.length)
{
Write-Host "OK"
}
else
{
Write-Host "FAILURE"
}
}
# Tests
AssertLength 0 (Flatten @())
AssertLength 1 (Flatten 1)
AssertLength 1 (Flatten @(1))
AssertLength 2 (Flatten @(1, 2))
AssertLength 2 (Flatten @(1, @(2)))
AssertLength 3 (Flatten @(1, @(2, @(3))))
您可以使用.NET的String.Join方法
[String]::Join("",$array)
Powershell v4.0中引入的解决方案可能最为优雅。就性能而言,它的优点是不需要构建管道,因此在某些情况下,它的性能可能会更好
> $a.ForEach({$_}).Count
3
如果已经有管道,则展平数组的最简单方法是通过管道将其写入输出:
> $b = $a | Write-Output
> $b.Count
3
以逗号作为前缀将强制powershell返回数组,即使只有一个项要返回。如果没有逗号,Powershell将把数组分解为与数组内容类型相同的单个对象。这可能会让来自其他强类型语言的人非常困惑。管道到%
起作用,但管道到测量对象或?
不起作用。这一定是因为%
处理管道输入的方式,而不是管道本身。这个问题是关于连接数组,而不是字符串。
> $b = $a | Write-Output
> $b.Count
3