我有一个包含大约 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# 范围的新语法来支持此用例(;相反,它提取索引为1
、0
和-1
(最后一个(的元素, 因为这些是范围运算符(..
(生成的数组(索引(的元素。
- PowerShell 支持索引
+ $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允许通过+
运算符组合两个或多个范围。特别是如果您希望数组是不可变的,这应该是最佳解决方案。