如何将数组中的第一个元素移动到电源外壳中的最后一个位置?



我有一个包含大约 10 个项目的 powershell 数组。我正在尝试获取数组的第一个元素 (0( 并将其移动到最后一项。最后的数组中仍然(只有(10 个项目。

如果您不介意创建一个数组,这里有一个简洁的解决方案:

$a = 1..10 # sample array: 1, 2, ..., 10
$a = $a[1..($a.count-1)] + $a[0]

Minmaxavg最终在他们的答案中提出了一个更简洁的替代方案:$a[1..($a.count-1) + 0]
在性能方面,这两种解决方案几乎完全相同。
此外,它们的[array]::Copy()解决方案是一种更高效的就地替代方案 - 代价是编写起来更复杂;它可以简化为:
$first = $a[0]; [array]::Copy($a, 1, $a, 0, $a.Count - 1); $a[-1] = $first

$a现在包含:

2
3
4
5
6
7
8
9
10
1
  • $a[1..($a.count-1)]返回一个新数组,其中包含$a的所有元素,从索引1处的元素开始,即从第二个元素开始。

    • 1..($a.count-1)是一个范围表达式,它本身创建一个数组 - 要从输入数组中提取的索引数组。
    • 顺便说一句:
      • PowerShell 支持索引-1引用数组的最后一个元素,-2引用倒数第二个元素,依此类推。
      • 但是,在一个范围内使用负索引可能无法达到预期;例如,1..-1不会提取从第二个到倒数第二个的所有元素(GitHub 问题 #7940 提出了类似于 C# 范围的新语法来支持此用例(;相反,它提取索引为10-1(最后一个(的元素, 因为这些是范围运算符(..(生成的数组(索引(的元素。
  • + $a[0]第一个元素"追加"到该新数组中;从技术上讲,这将创建另一个数组,该数组是LHS和RHS元素的串联。

  • 总之,在此过程中创建了3个数组:2 个辅助的、后台的瞬态数组,以及分配给$a的结果数组。

  • 因此,虽然使用范围运算符 (..( 提取数组切片并使用+连接数组非常方便,但它效率不高,尽管对于通常无关紧要的小数组 - 但是,请注意在循环中使用+="追加"到数组,因为您将在每次迭代中重新创建数组。

如果要就地旋转数组,这比在Powershell中手动迭代和移动元素更有效(.NETArray.Copy类似于JavaSystem.arraycopy(:

New-Variable -Name first -Value $arr[0] -Scope Private
[array]::Copy($arr, 1, $arr, 0, $arr.Length - 1)
$arr[$arr.Length - 1] = $Private:first

如果需要复制(10 个元素应该没问题(:

$arr = $arr[1 .. ($arr.Length - 1) + 0]

Powershell允许通过+运算符组合两个或多个范围。特别是如果您希望数组是不可变的,这应该是最佳解决方案。

最新更新