我有一个大约有10个项目的powershell数组。我正在尝试获取数组的第一个元素(0)并将其移动到最后一个项目。最后,阵列中仍然会有(仅)10个项目。
如果你想要就地旋转数组,这比在Powershell中手动迭代和移动元素更有效(.NET Array.Copy
类似于Java System.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允许通过+
算子组合两个或更多范围。特别是如果您希望数组是不可变的,这应该是最佳解决方案。
如果您不介意创建新阵列,这里有一个简洁的解决方案:
$a = 1..10 # sample array: 1, 2, ..., 10
$a = $a[1..($a.count-1)] + $a[0]
minmaxavg最终在their answer提出了一个更简洁的选择:$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
中的元素开头,即从第2个元素开始。
1..($a.count-1)
是一个范围表达式,它本身创建一个数组 - 从输入数组中提取的索引数组。
暂且不说:PowerShell支持索引-1
来引用数组的最后一个元素,-2
来引用倒数第二个,依此类推。但是,在某个范围内使用负指数可能无法达到您的预期;例如,1..-1
不提取从第二个到倒数第二个的所有元素;相反,它提取索引为1
,0
和-1
(最后一个)的元素,因为它们是范围运算符(..
)生成的数组(索引)的元素。+ $a[0]
将第一个元素“追加”到新数组;从技术上讲,这会创建另一个数组,它是LHS和RHS元素的串联。$a
的结果数组。..
)来提取数组切片并使用+
来连接数组非常方便,但它效率不高,尽管通常无关紧要的小数组 - 谨防“附加”到数组中的数组然而,使用+=
循环,因为您将在每次迭代中重新创建数组。