将字符串数组拆分为最大大小的块

时间:2018-06-27 20:01:27

标签: arrays powershell

我正在尝试确保将未知长度的数组拆分为一个或多个最多包含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"))

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

2 个答案:

答案 0 :(得分:2)

使用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到$i+$size之前的索引的索引,即数组中从位置$size开始的下一个$i元素。如果少于$size个元素,则表达式将仅给出剩余数量的元素。

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

答案 1 :(得分:1)

我真的很喜欢Ansgar的解决方案,但是keys集合不是数组,因此您不能使用数组范围语法。键是OrderedDictionaryKeyValueCollection。我已经使用out-string -stream来将OrderedDictionaryKeyValueCollection强制为数组。

$keys = $metricDefinitionsHash.Keys | out-string -stream
$size = 2
$metricsQueryParts = @()
for ($i=0; $i -lt $keys.Count; $i+=$size) {
    $metricsQueryParts += ,$keys[$i..($i+$size-1)]
}