我有一个大约有10个项目的Powershell阵列。我正在尝试采用数组的第一个元素(0),并将其移到最后一个项目。最后,阵列中仍将只有10个项目。
答案 0 :(得分:1)
如果要就地旋转数组,这比在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允许通过+
运算符组合两个或多个范围。尤其是如果您希望数组不可变,那么这应该是最佳的解决方案。
答案 1 :(得分:1)
如果您不介意创建一个 new 数组,这是一个简洁的解决方案:
$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)]
返回一个 new数组,该数组包含$a
的所有元素,它们从索引1
的元素开始,即,以< em> 2nd 元素。
1..($a.count-1)
是一个 range 表达式,它本身会创建一个数组-从输入数组中提取的索引数组。-1
引用数组的 last 元素,-2
引用倒数第二个,依此类推。但是,在 range 中使用负索引可能无法达到您的预期。例如,1..-1
不会不提取第二到倒数第二个元素;相反,它提取具有索引1
,0
和-1
(最后一个)的元素,因为这些是范围运算符({{1 }})生成。 ..
将 first 元素“追加”到该新数组;从技术上讲,这会创建另一个数组,该数组是LHS和RHS元素的串联。
总而言之,在此过程中创建了 3 个数组:2个幕后辅助,临时数组,以及分配回+ $a[0]
的结果数组。
因此,虽然使用范围运算符($a
)提取数组切片并使用..
连接数组很方便,但效率不高,尽管使用小数组通常并不重要-但是请注意,+
会在循环中“附加”到数组,因为您将在每次迭代中重新创建数组。