Arrays(数组)
本节介绍 PowerShell 中数组的创建、访问、遍历、增删改、筛选排序、管道交互、多维与交错数组,以及性能与实践建议。
1. 创建数组
- 逗号分隔字面量:powershell
$nums = 1,2,3,4 $mix = 1, 'a', (Get-Date) $empty = @() # 空数组 - 强类型数组(约束元素类型):powershell
$ints = [int[]](1,2,3) $bytes = [byte[]](0x01,0xFF) # 先创建空数组再转换类型: $ints = [int[]]@() - 展开运算:powershell
$a = 1,2; $b = 3,4 $c = $a + $b # 结果是新数组 1,2,3,4(注意:数组不可变长,+ 会创建新数组)
2. 访问与切片
- 索引(支持负索引、范围):powershell
$nums[0] # 第一个 $nums[-1] # 最后一个 $nums[1..3] # 1 到 3 下标的子数组 $nums[0,2,4] # 选择多个离散下标 $nums[($nums.Length-1)..0] # 反向
3. 遍历(枚举)
powershell
foreach ($n in $nums) { $n * 2 }
$nums | ForEach-Object { $_ * 2 }- 从 PowerShell 3+ 起,数组提供 .ForEach()/.Where() 扩展方法(便捷且高效):powershell
$nums.Where({ $_ -gt 10 }, 'First', 3) # 找到前 3 个 > 10 的元素 $nums.ForEach({ $_ * 2 }) # 映射
4. 增删改(可变性与替代)
- 数组是“固定长度”的集合,使用 += 或 + 追加元素会创建新数组,频繁操作有性能开销:powershell
$nums += 5 # 新数组(原数组未就地扩容) $nums = $nums + 6 - 插入/删除常用“切片拼接”技巧:powershell
# 在索引 2 处插入 99 $nums = $nums[0..1] + 99 + $nums[2..-1] # 删除索引 3 的元素 $nums = $nums[0..2] + $nums[4..-1] - 高性能追加:推荐使用泛型 List[T],最后再 ToArray()powershell
$list = [System.Collections.Generic.List[int]]::new() $list.AddRange(1..10000) $list.Add(10001) $nums = $list.ToArray()
5. 筛选、排序、去重
powershell
$nums | Where-Object { $_ -gt 3 } | Sort-Object -Descending
$nums | Sort-Object | Get-Unique # 注意:Get-Unique 需要“已排序”的输入
$nums -contains 3 # 是否包含值 3(布尔)
5 -in $nums # 5 是否在数组中6. 其他常用操作
powershell
$nums.Length
$nums.Count
($nums -join ',') # 拼接为字符串
"1,2,3,4" -split ',' # 切分为数组
$a,$b,$c = 1,2,3 # 并行解包7. 多维数组与交错数组
- 多维(矩阵):powershell
$grid = New-Object 'object[,]' 2,3 $grid[0,1] = 'X' $grid[1,2] = 'Y' - 交错(数组的数组):powershell
$jagged = @(@(1,2), @('a','b')) $jagged[0][1] # 2
8. 管道与枚举行为
- 大多数命令会逐项处理数组元素:powershell
1,2,3 | ForEach-Object { $_ * 10 } - 一元逗号防止被展开(将单个对象包成长度为 1 的数组):powershell
,(Get-Item .\file.txt) | Measure-Object
9. 实用示例
- 找出当前目录体积最大的前 5 个文件:powershell
Get-ChildItem -File | Sort-Object Length -Descending | Select-Object -First 5 Name, Length - 将偶数与奇数分组(PowerShell 3+):powershell
$nums = 1..20 $even = $nums.Where({ $_ % 2 -eq 0 }) $odd = $nums.Where({ $_ % 2 -ne 0 })
10. 性能与建议
- 大量追加/插入请使用 List[T] 或队列/栈;最终再转回数组。
- 需要稳定排序时使用 Sort-Object(默认稳定)。
- 对象数组处理属性时,结合 Select-Object/Where-Object 效果最佳。