How can I “zip” two arrays in PowerShell?

后端 未结 2 837
太阳男子
太阳男子 2021-02-05 13:47

I want to zip two arrays, like how Ruby does it, but in PowerShell. Here\'s a hypothetical operator (I know we\'re probably talking about some kind of goofy pipeline, but I just

相关标签:
2条回答
  • 2021-02-05 14:09
    # Multiple arrays
    $Sizes = @("small", "large", "tiny")
    $Colors = @("red", "green", "blue")
    $Shapes = @("circle", "square", "oval")
    
    # The first line "zips"
    $Sizes | ForEach-Object { $i = 0 }{ @{size=$_; color=$Colors[$i]; shape=$Shapes[$i]}; $i++ } `
     | ForEach-Object { $_.size + " " + $_.color + " " + $_.shape }
    

    Outputs:

    small red circle
    large green square
    tiny blue oval
    
    0 讨论(0)
  • 2021-02-05 14:13

    There's nothing built-in and it's probably not recommended to "roll your own" function. So, we'll take the LINQ Zip method and wrap it up.

    [System.Linq.Enumerable]::Zip((1, 2, 3), ('A', 'B', 'C'), [Func[Object, Object, Object[]]]{ ,$args })
    

    That works, but it's not pleasant to work with over time. We can wrap the function (and include that in our profile?).

    function Select-Zip {
        [CmdletBinding()]
        Param(
            $First,
            $Second,
            $ResultSelector = { ,$args }
        )
    
        [System.Linq.Enumerable]::Zip($First, $Second, [Func[Object, Object, Object[]]]$ResultSelector)
    }
    

    And you can call it simply:

    PS> Select-Zip -First 1, 2, 3 -Second 'A', 'B', 'C'
    1
    A
    2
    B
    3
    C
    

    With a non-default result selector:

    PS> Select-Zip -First 1, 2, 3 -Second 'A', 'B', 'C' -ResultSelector { param($a, $b) "$a::$b" }
    1::A
    2::B
    3::C
    

    I leave the pipeline version as an exercise to the astute reader :)

    PS> 1, 2, 3 | Select-Zip -Second 'A', 'B', 'C'
    
    0 讨论(0)
提交回复
热议问题