2009-12-22 8 views
8

Ich habe ein Array von Strings. Nicht sicher, ob es einen einfachen Weg gibt, den Index eines zuerst im Array gefundenen Elements zu erhalten?PS: Erhalte den Index in einer Array-Liste

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

Ich könnte es in einer Schleife tun. nicht sicher, ob es einen alternativen Weg gibt?

Antwort

11

Verwenden Sie eine for-Schleife (oder eine foreach-Schleife, die über den Array-Index iteriert ... gleichen Unterschied). Ich kenne keine Systemvariable, die den aktuellen Array-Index innerhalb einer foreach-Schleife enthält, und ich glaube nicht, dass einer existiert.

+1

Schön. Wenn zwei "B" in dem Array vorhanden sind, wird das Ergebnis ein Array von Indexwerten sein. –

2

Verwenden von Where-Object ist eher wahrscheinlich langsam, weil es die Pipeline für eine einfache Operation umfasst.

Der schnellste/einfachste Weg, dies zu tun, die ich kenne (in Powershell V2) ist eine Variable das Ergebnis einer für

$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" 
24

zuweisen Wenn Sie wissen, dass der Wert in der nur einmal auftritt Array, das [array] :: IndexOf() -Methode ist ein ziemlich guter Weg zu gehen:

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

Neben prägnanten und mehr auf den Punkt, wenn das Array sehr groß ist die Leistung dieses Ansatzes ist ein bisschen besser als ein PowerShell-Cmdlet wie Where-Object. Dennoch wird nur das erste Vorkommen des angegebenen Elements gefunden. Aber man kann die andere Überlastung von IndexOf verwendet das nächste Vorkommen zu finden:

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

$ ndx wird -1, wenn das Element nicht gefunden wird.

Verwandte Themen