2009-12-22 22 views
8

Bir dizi dizim var. Dizide bulunan bir öğenin dizinini almanın basit bir yolu olup olmadığından emin değil misiniz?PS: Dizinin bir dizini içinde dizin alın

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

Bir döngüde yapabilirim. alternatif bir yol olup olmadığından emin değil misiniz?

cevap

11

Bir for döngüsü (veya dizi dizini üzerinde yineleyen bir foreach döngüsü ... aynı fark) kullanın. Geçerli dizi dizinini foreach döngüsünde tutan herhangi bir sistem değişkenini bilmiyorum ve bir tane var sanmıyorum. basit bir işlem için boru hattı içermektedir çünkü

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

Güzel. Dizide iki "B" harfi varsa, sonuç bir dizi dizin değeri olacaktır. –

2

Nerede-Nesne kullanarak, yavaş aslında daha olasıdır.

I (PowerShell V2) Bildiğim kadarıyla bunu yapmanın en hızlı/kolay yolu değeri sadece bir kez oluştuğu biliyorsanız

$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

için sonucu başka bir değişken etmektir dizi çok büyükse bu yaklaşımın performansı biraz olduğunu veciz olmasının yanı sıra ve noktaya

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

: dizi, [dizi] :: IndexOf() yöntemi gitmek için oldukça iyi bir yoldur Nerede Nesne gibi bir PowerShell cmdlet kullanmanın daha iyi. Yine de, yalnızca belirtilen öğenin ilk oluşumunu bulur. Ama sonraki örneğini bulmak için IndexOf'un diğer aşırı kullanabilirsiniz:

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

$ Ndx olacak -1 öğe bulunmazsa.

İlgili konular