Разбить массив строк на куски максимального размера - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь обеспечить разбиение массива неизвестной длины на один или несколько массивов с максимум 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 голосов
/ 28 июня 2018

Мне действительно нравится решение Ansgar, но коллекция ключей не является массивом, и поэтому вы не можете использовать синтаксис диапазона массива. Ключи - это 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)]
}
0 голосов
/ 28 июня 2018

Используйте цикл 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 как вложенный массив, а не просто объединяет два массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...