在PowerShell中展平数组

时间:2009-04-02 23:10:26

标签: collections powershell

假设我们有:

$a = @(1, @(2, @(3)))

我想将$a压平为@(1, 2, 3)

我找到了one solution

@($a | % {$_}).count

但也许有更优雅的方式?

4 个答案:

答案 0 :(得分:12)

管道是压扁嵌套结构的正确方法,因此我不确定更多“优雅”是什么。是的,语法看起来有点吵,但坦率地说是非常有用的。

答案 1 :(得分:10)

相同的代码,只包含在函数中:

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))))

答案 2 :(得分:2)

您可以使用.NET的String.Join方法。

[String]::Join("",$array)

答案 3 :(得分:0)

Powershell v4.0 中引入的 the .ForEach() array method 可能最优雅地解决了这个问题。在性能方面,它具有不需要构建管道的优势,因此在某些情况下它可能会表现得更好。

> $a.ForEach({$_}).Count
3

如果您已经有一个管道,那么扁平化数组的最简单方法是通过 Write-Output 管道它:

> $b = $a | Write-Output
> $b.Count
3