arrays - variable - 將數組相對於兩端切割的慣用方法是什麼?




powershell variable arrays (4)

Powershell的數組符號在切片數組末尾時有相當奇怪的行為,儘管有記錄。 官方文檔中的這一部分很好地總結了奇異性:

負數從數組末尾開始計算。 例如,“ - 1”表示數組的最後一個元素。 要顯示數組的最後三個元素,請鍵入:

$a[-3..-1]

但是,使用此表示法時要小心。

$a[0..-2]

除最後一個命令外,此命令不引用數組的所有元素。 它指的是數組中的第一個,最後一個和倒數第二個元素。

以下代碼證實了這一奇異性:

$a = 0,1,2,3
$a[1..-1]

這確實輸出了這個奇怪的結果:

1
0
3

那麼,問題是,用一個索引相對於開始切片而另一個相對於數組末尾的慣用方法是什麼?

請告訴我這比這個醜陋的混亂更好:

$a[1..($a.Count-1)]

編輯:

另一種描述我正在尋找的東西的方法是:這個python表達式的慣用Powershell等價物:

a=1,2,3,4
a[1:-1]

當然,評估為(2,3)


好吧,所以它很難看,但我發現[1..99]或[1..999]有效。 但是,不要使用[1..999999],因為PowerShell在確定只有前五個問題之前首先生成一個值數組,最後一個需要花費大量時間來預生成一個百萬元素數組。

這對於某些腳本方案非常有用,對於生產代碼來說非常糟糕。


如果您正在尋找數組中的前三個和後三個元素,並將結果放在一個數組中,那麼添加一個小數組就可以滿足需要。

[array]$A = (([int][char]'A')..([int][char]'Z')) | ForEach-Object {[char]$_}
$B = $A[0..2]+$A[-3..-1]
Clear-Host
Write-Host "Original List"
Write-Host $A -NoNewline -Separator ', '
Write-Host
Write-Host "First three and last three"
Write-Host $B -NoNewline -Separator ', '

產量:

Original List
A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z
First three and last three
A, B, C, X, Y, Z

我相信這是正確的做法。 所有其他方法需要更多代碼。

$a[1..($a.Count-1)]

此外,如果將數組轉換為字符串,則可以輕鬆獲取如下數據:

$a = 0,1,2,3
[string]::Concat($a).Substring(1)

這可能是以兩種方式對數組進行切片的最慣用的方法:

$ array [start..stop]其中stop是通過將數組的長度減去一個從數組末尾偏移的值來定義的:

$a = 1,2,3,4,5,6,7,8,9
$start = 2
$stop = $a.Length-3
$a[$start..$stop]

這將返回3 4 5 6 7

起始值從零開始計數,因此起始值“2”為您提供數組的第三個元素。 使用($ a.Length-3)計算停止值,這將刪除最後兩個值,因為$ a.Length-3本身包含在切片中。

為了清晰起見,我已經定義了$ start和$ stop,顯然你也可以這樣寫:

$a = 1,2,3,4,5,6,7,8,9
$a[2..($a.Length-3)]

這也將返回3 4 5 6 7





idioms