【问题标题】:How can I "zip" two arrays in PowerShell?如何在 PowerShell 中“压缩”两个数组?
【发布时间】:2017-03-30 15:21:08
【问题描述】:

我想压缩两个数组,例如 how Ruby does it,但在 PowerShell 中。这是一个假设的运算符(我知道我们可能在谈论某种愚蠢的管道,但我只是想展示一个示例输出)。

PS> @(1, 2, 3) -zip @('A', 'B', 'C')
@(@(1, 'A'), @(2, 'B'), @(3, 'C'))

【问题讨论】:

  • 您想将它们保留为数组(数组的数组),还是将所有值保留为一个数组?
  • 我不想合并数组。我需要成对的元素供以后处理,希望在管道中。
  • @RogerLipscombe 这看起来比滚动你自己的函数更好
  • [Linq.Enumerable]::Zip((1, 2, 3), ('A', 'B', 'C'), [Func[Object, Object, Object[]]]{,$args})

标签: arrays powershell


【解决方案1】:

没有任何内置功能,可能不建议“滚动您自己的”功能。因此,我们将采用 LINQ Zip 方法并将其包装起来。

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

这行得通,但随着时间的推移使用起来并不愉快。我们可以包装函数(并将其包含在我们的配置文件中?)。

function Select-Zip {
    [CmdletBinding()]
    Param(
        $First,
        $Second,
        $ResultSelector = { ,$args }
    )

    [System.Linq.Enumerable]::Zip($First, $Second, [Func[Object, Object, Object[]]]$ResultSelector)
}

你可以简单地称呼它:

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

使用非默认结果选择器:

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

我将管道版本留给精明的读者作为练习:)

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

【讨论】:

    【解决方案2】:
    # 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 }
    

    输出:

    small red circle
    large green square
    tiny blue oval
    

    【讨论】:

      猜你喜欢
      • 2014-03-27
      • 2019-06-14
      • 2017-11-06
      • 2014-05-31
      • 1970-01-01
      • 2018-11-03
      • 2013-05-26
      相关资源
      最近更新 更多