PowerShell函数返回数组数组时单块数组被扁平化的问题求解
解决PowerShell中ChunkBy函数单块返回时的数组扁平化问题
问题背景
需要将长字符串列表划分为指定大小的“块”,预期返回数组的数组——外层数组包含多个块,每个块是最多含指定数量元素的数组。原实现的ChunkBy函数在多数场景下正常,但当输入列表仅能生成一个块时,PowerShell会自动扁平化外层数组,直接返回单个数组而非嵌套数组结构。
原ChunkBy函数代码:
function ChunkBy($items,[int]$size) { $list = new-object System.Collections.ArrayList $tmpList = new-object System.Collections.ArrayList foreach($item in $items) { $tmpList.Add($item) | out-null if ($tmpList.Count -ge $size) { $list.Add($tmpList.ToArray()) | out-null $tmpList.Clear() } } if ($tmpList.Count -gt 0) { $list.Add($tmpList.ToArray()) | out-null } return $list.ToArray() }
辅助展示函数ShowChunks:
function ShowChunks($items) { Write-Output " " Write-Output "array has $($items.Length) chunks" Write-Output "-----------------" foreach($c in $items) { [system.String]::Join(",", $c) } }
测试代码:
$testArray = ("a","b","c","d","e") $res1 = ChunkBy $testArray 3 ShowChunks $res1 $res2 = ChunkBy $testArray 6 ShowChunks $res2
错误输出($res2)
array has 5 chunks ----------------- a b c d e
预期输出($res2)
array has 1 chunks ----------------- a,b,c,d,e
问题原因
PowerShell的返回值处理默认会对单元素数组进行扁平化拆包:当函数返回的数组仅包含一个元素时,PowerShell会自动移除外层数组,直接返回该元素本身。这就导致当只生成一个块时,原本的[数组[字符串]]变成了[字符串[]]。
解决方案
方法1:用逗号运算符强制保留外层数组
修改函数的返回语句,使用,运算符将结果包装成数组,强制PowerShell保留嵌套结构:
function ChunkBy($items,[int]$size) { $list = new-object System.Collections.ArrayList $tmpList = new-object System.Collections.ArrayList foreach($item in $items) { $tmpList.Add($item) | out-null if ($tmpList.Count -ge $size) { $list.Add($tmpList.ToArray()) | out-null $tmpList.Clear() } } if ($tmpList.Count -gt 0) { $list.Add($tmpList.ToArray()) | out-null } # 用逗号运算符强制返回数组结构 return ,$list.ToArray() }
方法2:指定函数返回类型为数组
在函数定义时明确指定返回类型为[array],让PowerShell严格按照数组类型返回结果:
function ChunkBy($items,[int]$size) [array] { $list = new-object System.Collections.ArrayList $tmpList = new-object System.Collections.ArrayList foreach($item in $items) { $tmpList.Add($item) | out-null if ($tmpList.Count -ge $size) { $list.Add($tmpList.ToArray()) | out-null $tmpList.Clear() } } if ($tmpList.Count -gt 0) { $list.Add($tmpList.ToArray()) | out-null } return $list.ToArray() }
验证结果
修改后重新运行测试代码,$res2将输出符合预期的嵌套结构:
array has 1 chunks ----------------- a,b,c,d,e
内容的提问来源于stack exchange,提问作者codeulike
相关产品推荐
相关产品推荐

