Индекс массива от первого до второго последнего в PowerShell
Как я могу получить диапазон элементов массива от первого до второго последнего?
Например,
$array = 1,2,3,4,5
$array[0] - will give me the first (1)
$array[-2] - will give me the second last (4)
$array[0..2] - will give me first to third (1,2,3)
$array[0..-2] - I'm expecting to get first to second last (1,2,3,4) but I get 1,5,4 ???
Я знаю, что могу сделать длинную руку и пойти for($x=0;$x -lt $array.count;$x++)
, но я искал ярлык в квадратных скобках.
Ответы
Ответ 1
Вам просто нужно вычислить конечный индекс, например:
$array[0..($array.length - 2)]
Не забудьте проверить, что на самом деле у вас на самом деле есть более двух записей в вашем массиве, иначе вы обнаружите, что в результате получаете дубликаты.
Примером такого дубликата может быть:
@(1)[0..-1]
Что из массива одного 1
дает следующий вывод
1
1
Ответ 2
Как уже упоминалось ранее, лучшее решение здесь:
$array[0..($array.length - 2)]
Проблема, с которой вы столкнулись с $array[0..-2]
, может быть объяснена природой выражения "0..-2"
и оператора диапазона ".."
в PowerShell. Если вы попытаетесь оценить только эту часть "0..-2"
в PowerShell, вы увидите, что результатом будет массив чисел от 0 до -2.
>> 0..-2
0
-1
-2
И когда вы пытаетесь сделать $array[0..-2]
в PowerShell, это так же, как если бы вы делали $array[0,-1,-2]
. Вот почему вы получаете результаты как 1, 5, 4
вместо 1, 2, 3, 4
.
Сначала это может показаться нелогичным, особенно если у вас есть некоторый опыт работы с Python или Ruby, но вы должны принять это во внимание при использовании PowerShell.
Ответ 3
Может быть ситуация, когда вы обрабатываете список, но вы не знаете длины. У объекта выбора есть параметр -skiplast.
(1,2,3,4,5 | select -skiplast 2)
1
2
3