How can I "zip" two arrays in PowerShell? How can I "zip" two arrays in PowerShell? arrays arrays

How can I "zip" two arrays in PowerShell?


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'1A2B3C

With a non-default result selector:

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

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

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


# 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 circlelarge green squaretiny blue oval