Хотя операторы PowerShell -in
/ -contains
позволяют проверять наличие данного значения в коллекции (является ли данное значение элементом коллекции), есть нет прямая поддержка для получения индекса элемента с использованием только собственных функций PowerShell .
Для . NET массивов (например, созданные в вашем вопросе [1] ) вы можете использовать их .IndexOf()
экземпляр метод , в котором используется сравнение case-SENSITIVE на основе культуры current ; Например:
$array.IndexOf('red') # -> 1; case-SENSITIVE, current-culture comparison
Обратите внимание, что сам PowerShell, как правило, нечувствителен к регистру, а для -eq
(и в других контекстах) для сравнения используется культура инвариант .
A решение без учета случая на основе инварианта культуры с использованием типа массива stati c [Array]::FindIndex()
method :
$array = 'blue', 'ReD', 'yellow'
[Array]::FindIndex($array, [Predicate[string]] { 'red' -eq $args[0] }) # -> 1
Обратите внимание, что путем делегирования блоку сценариев PowerShell ({ ... }
), в котором каждый элемент ($args[0]
) проверяется на соответствие целевому значению с помощью -eq
вы неявно получаете нечувствительное к регистру, инвариантное к культуре поведение PowerShell.
В качестве альтернативы вы можете использовать оператор -ceq
для сопоставления с регистром (но все еще с учетом культурных особенностей).
($args[0].Equals('red', 'CurrentCulture')
даст вам поведение, эквивалентное .IndexOf()
решение выше).
Как правило, этот подход позволяет использовать более сложные методы сопоставления , такие как использование оператора -match
на основе регулярных выражений или оператора -like
на основе групповых символов .
Приведенные выше решения находят индекс первого соответствующего элемента, если таковой имеется.
К найти индекс последнего соответствующий элемент , если есть, используйте:
Примечание. Хотя существует метод [Array]::FindAll()
для возврата всех элементов , соответствующих данному предикату ( критерий), существует нет прямой метод для нахождения всех индексов .
[1] Обратите внимание, что вы делаете не нужно * 11 16 *, оператор подвыражения массива для создания массива из индивидуально перечисляемых элементов: нумерация их с помощью ,
, достаточно только оператора конструктора массива *1121*:
$array = 'blue','red','purple','pink'