我想把一个数组转换成一组更小的数组,基于一个变量,所以当大小为3时,0,1,2,3,4,5,6,7,8,9
将变成0,1,2
,3,4,5
,6,7,8
,9
。
我目前的做法:
$ids=@(0,1,2,3,4,5,6,7,8,9)
$size=3
0..[math]::Round($ids.count/$size) | % {
# slice first elements
$x = $ids[0..($size-1)]
# redefine array w/ remaining values
$ids = $ids[$size..$ids.Length]
# return elements (as an array, which isn't happening)
$x
} | % { "IDS: $($_ -Join ",")" }
产生:
IDS: 0
IDS: 1
IDS: 2
IDS: 3
IDS: 4
IDS: 5
IDS: 6
IDS: 7
IDS: 8
IDS: 9
我希望它是:
IDS: 0,1,2
IDS: 3,4,5
IDS: 6,7,8
IDS: 9
我错过了什么?
6条答案
按热度按时间toe950271#
为完整起见:
用法:
w6lpcovy2#
hgqdbh6s3#
您可以使用
,$x
,而不仅仅是$x
。文档中的
about_Operators
部分包含以下内容:vyswwuz24#
克雷格自己已经方便地将拆分(分区)功能封装在一个**robust function中:
让我提供一个性能更好的改进**(PSv3+语法,重命名为
Split-Array
),它:System.Collections.Generic.List[object]]
集合更有效地收集输入对象。对于较小的输入集合,优化并不重要,但一旦处理了数千个元素,速度就会大大提高:
使用
Time-Command
时,大致给予一下性能的提高:运行Windows 5.1的单核Windows 10虚拟机的示例结果(绝对时间并不重要,但因素是):
请注意,未优化的函数几乎慢了70倍。
stszievb5#
要向Bill Stewart's effective solution添加 * 说明 *:
**隐式 * 或使用
return
输出数组[1]之类的集合时,会通过pipeline****分别发送其元素;也就是说,集合是 enumerated(展开的):使用
,
(逗号;数组构造操作符)来防止枚举是一种方便、简洁但有些晦涩 * 解决方法 *:也就是说,
, <collection>
在原始集合周围创建一个临时的单元素helper数组,以便枚举只应用于helper数组,并将包含的原始集合按原样输出为单个对象。一个概念上更清晰,但更冗长和 * 更慢 * 的方法是使用
Write-Output -NoEnumerate
,它清楚地表明了将集合 * 作为单个对象 * 输出的意图。有关 * 目视检查 * 的缺陷:
在输出 * 以显示 * 时,多个数组之间的边界再次被擦除:
也就是说,即使两个2元素数组分别作为单个对象发送,但通过在各自的行上显示元素,输出看起来像是接收到了一个平面4元素数组。
一个简单的解决方法是对每个数组进行 stringify,这会将每个数组转换为一个字符串,该字符串包含以空格分隔的元素列表。
现在很明显,收到了两个单独的数组。
[1]枚举哪些数据类型:
实现
IEnumerable
接口的数据类型的示例会自动枚举,但也有例外:同样实现
IDictionary
的类型,如 hashtables,* 不 * 枚举,XmlNode
示例也不枚举。相反,
DataTable
的示例(不实现IEnumerable
)* 被 * 枚举(作为它们的.Rows
集合的元素)-参见this answer和源代码。此外,请注意,external program 的stdout输出是 * 逐行 * 枚举的。
46scxncf6#
由于PowerShell“数组”通常在[pipeline]中展开,并且使用pipeline(https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_pipelines)具有内存使用优势(因为每个项都是单独处理的),因此我将问题更改为:
将PowerShell * 管道 * 分割为较小的批
我为此创建了一个小的
Create-Batch
函数:这将创建包含所有itam的单个批处理(数组)。此语句的结果与以下语句相同:
Get-Process |Set-Content .\Process.txt
,但是注意,这看起来(由于还未知的原因)大约快两倍。参见:
#8270
Suggestion: Add a chunking (partitioning, batching) mechanism to Select-Object, analogous to Get-Content -ReadCount