我正在尝试确保将未知长度的数组拆分为一个或多个最多包含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"))
但是...我能以更有效的方式实现我的目标吗?
答案 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)]
}