Skip to content

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 效果最佳。

本站内容仅供学习和研究使用。