PS: Получите индекс в списке массива

У меня есть массив строк. Не уверенный, если существует простой способ получить индекс объекта, сначала найденного в массиве?

# example array
$array = "A", "B", "C"
$item = "B"
# the following line gets null, any way to get its index?
$index = $array | where {$_ -eq $item} | ForEach-Object { $_.Index }

Я мог сделать это в цикле. не уверенный, если существует какой-либо альтернативный путь?

8
задан David.Chu.ca 22 December 2009 в 18:00
поделиться

3 ответа

Использовать цикл for (или цикл foreach, который выполняет итерацию над индексом массива... с той же разницей). Я не знаю ни одной системной переменной, которая бы хранила текущий индекс массива внутри цикла foreach, и думаю, что такой переменной не существует.

# example array
$array = "A", "B", "C"
$item = "B"
0..($array.Count - 1) | Where { $array[$_] -eq $item }
11
ответ дан 5 December 2019 в 04:52
поделиться

Если вы знаете, что значение в массиве встречается только один раз, то метод [array]::IndexOf() - это неплохой способ:

$array = 'A','B','C'
$item = 'B'
$ndx = [array]::IndexOf($array, $item)

Помимо того, что он лаконичен и кстати, если массив очень большой, то производительность такого подхода гораздо лучше, чем при использовании команды PowerShell вроде Where-Object. Тем не менее, она найдет только первое появление указанного элемента. Но можно использовать другую перегрузку IndexOf, чтобы найти следующее вхождение:

$ndx = [array]::IndexOf($array, $item, $ndx+1)

$ndx будет -1, если элемент не найден.

.
26
ответ дан 5 December 2019 в 04:52
поделиться

Использование Where-Object на самом деле более вероятно медленное, так как включает в себя конвейер для простой операции.

Самый быстрый/простой способ сделать это, который я знаю (в PowerShell V2) - назначить переменную на результат a for

$needle = Get-Random 100
$hayStack = 1..100 | Get-Random -Count 100
$found = for($index = 0; $index -lt $hayStack.Count; $index++) {
    if ($hayStack[$index] -eq $needle) { $index; break } 
}
"$needle was found at index $found"
2
ответ дан 5 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: