class Unroller {
[object[]] $Array
Unroller() { }
Unroller([object[]] $Array) {
$this.Array = $Array
}
static [object] Unroll([object[]] $Array) {
$result = foreach($item in $Array) {
if($item -is [object[]]) {
[Unroller]::Unroll($item)
continue
}
$item
}
return $result
}
[object] Unroll () {
return [Unroller]::Unroll($this.Array)
}
}
# Instantiating and using using the instance method of our class:
$instance = [Unroller] $toUnroll
$instance.Unroll()
# Results in an array from 0 to 10
# Using the static method of our class, no need to instantiate:
[Unroller]::Unroll($toUnroll)
# Results in an array from 0 to 10
$queue = [Collections.Queue]::new()
$queue.Enqueue($toUnroll)
while($queue.Count) {
foreach($item in $queue.Dequeue()) {
if($item -is [object[]]) {
$queue.Enqueue($item)
continue
}
$item
}
}
# Using our given nested array as an example we can expect
# a flattened array with the following order:
# 10, 0, 1, 2, 3, 9, 4, 7, 8, 5, 6
5条答案
按热度按时间x7yiwoj41#
管道化是使嵌套结构扁平化的正确方法,所以我不确定什么会更“优雅”。是的,语法看起来有点行噪声,但坦率地说相当有用。
2020年编辑
现在推荐的语法是将
%
扩展为ForEach-Object
,这有点冗长,但可读性更强:wgmfuz8q2#
相同的代码,只是 Package 在函数中:
测试:
toe950273#
Powershell v4.0中引入的
.ForEach()
数组方法可能最完美地解决了这个问题。从性能方面来说,它的优点是不需要构造管道,因此在某些情况下,它的性能可能更好。如果你已经有了一个管道,扁平化数组最简单的方法就是通过
Write-Output
管道:wwtsj6pe4#
有一些 * 嵌套数组 * 的例子,其中管道到
ForEach-Object
根本无法处理它们。例如,给定嵌套数组:
如果我们尝试通过管道连接到
ForEach-Object
,结果将是:Write-Output
也不能处理展开:下面我们可以看到3个不同的例子,关于我们如何处理这些 * 嵌套数组 * 的扁平化,包括一个 * 单行anonymous function*。
*递归Function
此技术按顺序展开数组。
*单行匿名函数:
这个 * 脚本块 * 的逻辑与上面演示的函数完全相同。
**递归Class方法(可以是 * 静态 * 或 * 示例 )
和递归的
function
例子一样,我们可以期望数组保持它的顺序,我们可以补充一下,这种技术应该比function
快,因为方法的参数绑定要快得多。这种技术应该是最快的一种,缺点是我们不能期望有序数组。
最后,使用Stack可以保证顺序的保持,这种技术也是非常有效的。
uajslkp65#
您可以使用.NET的String.Join方法。