PS: получить индекс в списке массивов - PullRequest
8 голосов
/ 22 декабря 2009

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

# 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 }

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

Ответы [ 3 ]

25 голосов
/ 23 декабря 2009

Если вы знаете, что значение встречается в массиве только один раз, метод [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, если предмет не найден.

11 голосов
/ 22 декабря 2009

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

# example array
$array = "A", "B", "C"
$item = "B"
0..($array.Count - 1) | Where { $array[$_] -eq $item }
2 голосов
/ 22 декабря 2009

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

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

$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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...