首页 > 解决方案 > 将字符串数组拆分为最大大小的块

问题描述

我试图确保将一个未知长度的数组拆分为一个或多个数组,其中最多包含 20 个元素。

我四处搜索并找到了几个基于包含数字序列的数组的类似问题的答案(或者我可能只是遗漏了一些东西),但对于字符串数组却一无所获。

我想出了一个解决方案,但它似乎有点令人费解,我觉得它可能会更好。

例如,拿这个数组 -

$metricDefinitionsHash= [ordered]@{"this one" = "111"; "that one" = "222"; "another one" = "333"}

为了这个例子,也就是说我最多只需要两个元素 -

$metricsQueryParts = @()
$counter = 0
$metricDefinitionsHash.Keys | ForEach-Object {
    $index = [System.Math]::Floor($counter / 2)
    if ($metricsQueryParts.Length -eq $index)
    {
        $metricsQueryParts += ""
        $metricsQueryParts[$index] = @()
    }
    $metricsQueryParts[$index] += $_
    $counter++
}

所以现在我有一个数组数组 -

@(@("this one", "that one"), @("another one"))

但是……我能以更有效的方式实现我的目标吗?

标签: arrayspowershell

解决方案


使用for循环、范围运算符 ( ..) 和一元数组构造运算符 ( ,):

[array]$keys = $metricDefinitionsHash.Keys
$size = 3
$metricsQueryParts = @()
for ($i=0; $i -lt $keys.Count; $i+=$size) {
    $metricsQueryParts += ,$keys[$i..($i+$size-1)]
}

[array]$keys将键/值集合.Keys转换为通用数组(以便可以在其上使用索引运算符)。

该表达式$i..($i+$size-1)为您提供从 $i 到索引 before 的索引$i+$size,即$size数组中从 position 开始的下一个元素$i。如果元素数量少于$size元素,则表达式将仅给出剩余的元素数量。

一元数组构造运算符确保将其作为嵌套数组$keys[...]附加,而不是仅仅连接两个数组。$metricsQueryParts


推荐阅读