2009-12-22 7 views
8

Tengo una matriz de cadenas. ¿No está seguro de si hay una manera simple de obtener primero el índice de un elemento en la matriz?PD: Obtener índice en una lista de matriz

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

Podría hacerlo en un bucle. no estoy seguro de si hay alguna forma alternativa?

Respuesta

11

Utilice un bucle for (o un bucle foreach que itere sobre el índice de matriz ... misma diferencia). No sé de ninguna variable del sistema que contenga el índice de matriz actual dentro de un bucle foreach, y no creo que exista.

# example array 
$array = "A", "B", "C" 
$item = "B" 
0..($array.Count - 1) | Where { $array[$_] -eq $item } 
+1

Agradable. Si hay dos "B" en la matriz, el resultado será una matriz de valores de índice. –

2

El uso de Where-Object es más probable que sea lento, ya que implica la tubería para una operación simple.

La forma más rápida/más sencilla de hacer esto, que yo sepa (en PowerShell V2) es asignar una variable al resultado de una de

$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

Si se sabe que el valor se produce sólo una vez en el matriz, el método [matriz] :: IndexOf() es una muy buena manera de ir:

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

Además de ser conciso y al grano, si la matriz es muy grande el rendimiento de este enfoque es un poco mejor que usar un cmdlet de PowerShell como Where-Object. Aún así, solo encontrará la primera aparición del artículo especificado. Sin embargo, se puede utilizar la otra sobrecarga del IndexOf para encontrar la siguiente ocurrencia:

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

$ ndx habrá -1 si no se encuentra el elemento.

Cuestiones relacionadas