2009-12-22 45 views
8

Tôi có một chuỗi các chuỗi. Không chắc chắn nếu có cách đơn giản để có được chỉ mục của một mục đầu tiên được tìm thấy trong mảng?PS: Lấy chỉ mục trong danh sách mảng

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

Tôi có thể làm điều đó trong một vòng lặp. không chắc chắn liệu có cách nào khác không?

Trả lời

11

Sử dụng vòng lặp for (hoặc vòng lặp foreach lặp qua chỉ mục mảng ... cùng một sự khác biệt). Tôi không biết về bất kỳ biến hệ thống nào chứa chỉ mục mảng hiện tại bên trong vòng lặp foreach và tôi không nghĩ rằng nó tồn tại.

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

Tốt. Nếu có hai "B" trong mảng, kết quả sẽ là một mảng các giá trị chỉ mục. –

2

Sử dụng ở đâu-Object thực sự là nhiều khả năng là chậm, vì nó liên quan đến các đường ống dẫn cho một thao tác đơn giản.

Các nhanh nhất/Cách đơn giản nhất để làm điều này mà tôi biết (trong PowerShell V2) là gán một biến để kết quả của một cho

$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

Nếu bạn biết rằng giá trị chỉ xảy ra một lần trong mảng, phương pháp [mảng] :: IndexOf() là một cách khá tốt để đi:

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

Bên cạnh đó là ngắn gọn và đi thẳng vào, nếu mảng là rất lớn hiệu suất của phương pháp này là khá một chút tốt hơn là sử dụng lệnh ghép ngắn PowerShell như Where-Object. Tuy nhiên, nó sẽ chỉ tìm thấy sự xuất hiện đầu tiên của mục được chỉ định. Nhưng bạn có thể sử dụng quá tải khác của IndexOf để tìm lần xuất hiện tiếp theo:

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

$ ndx sẽ là -1 nếu không tìm thấy mục.

Các vấn đề liên quan