PowerShell遍历逆序数组时排序结果未保留问题求解
问题原因
PowerShell 中默认所有管道命令都不会原地修改传入的原始对象,你代码里用的Sort是Sort-Object cmdlet 的别名,它的执行逻辑是:接收管道传入的数组元素,完成排序后将排序后的新集合直接输出到控制台流,不会对原$symbols数组做任何修改。
你看到控制台打印了符合预期的倒序结果,只是因为排序后的新集合被默认输出到了控制台而已,这部分结果没有被存回变量,原数组始终保持初始化时的顺序,后续foreach遍历原数组自然会输出原始顺序的内容。
正确实现方式
根据你是否需要保留原数组,选对应写法即可:
- 需要覆盖原数组、后续都使用排序后的内容:把排序结果重新赋值给原变量
$symbols = @("Banana","Orange","Apple","Mango","Strawberry") # 排序后覆盖原变量 $symbols = $symbols | Sort-Object -Descending Write-Host "" foreach ($symbol in $symbols) { Write-Host $symbol }
- 不需要修改原数组,仅遍历时用排序结果:直接遍历排序生成的临时集合即可
$symbols = @("Banana","Orange","Apple","Mango","Strawberry") Write-Host "" # 直接遍历排序结果,不改动原数组 foreach ($symbol in ($symbols | Sort-Object -Descending)) { Write-Host $symbol }
补充:PowerShell 里几乎所有处理集合的原生cmdlet(比如
Select-Object、Where-Object)都是这种输出新对象、不修改原输入的逻辑,和其他语言里部分支持原地排序的方法逻辑有区别,注意区分即可。
内容的提问来源于stack exchange,提问作者user1151482
相关产品推荐
相关产品推荐

