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