У меня есть массив строк. Не уверенный, если существует простой способ получить индекс объекта, сначала найденного в массиве?
# 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 }
Я мог сделать это в цикле. не уверенный, если существует какой-либо альтернативный путь?
Использовать цикл for (или цикл foreach, который выполняет итерацию над индексом массива... с той же разницей). Я не знаю ни одной системной переменной, которая бы хранила текущий индекс массива внутри цикла foreach, и думаю, что такой переменной не существует.
# example array
$array = "A", "B", "C"
$item = "B"
0..($array.Count - 1) | Where { $array[$_] -eq $item }
Если вы знаете, что значение в массиве встречается только один раз, то метод [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, если элемент не найден.
.Использование 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"