2009-12-22 18 views
8

मेरे पास तारों की एक सरणी है। सुनिश्चित नहीं है कि सरणी में पहले किसी आइटम की अनुक्रमणिका प्राप्त करने का कोई आसान तरीका है या नहीं?पीएस: एक सरणी सूची में सूचकांक प्राप्त करें

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

मैं इसे एक लूप में कर सकता था। सुनिश्चित नहीं है कि कोई वैकल्पिक तरीका है या नहीं?

उत्तर

11

लूप के लिए उपयोग करें (या एक फ़ोरैच लूप जो सरणी अनुक्रमणिका पर समान होता है ... समान अंतर)। मुझे किसी सिस्टम वैरिएबल के बारे में पता नहीं है जो फोरैच लूप के अंदर मौजूदा सरणी इंडेक्स रखता है, और मुझे नहीं लगता कि कोई मौजूद है।

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

अच्छा। यदि सरणी में दो "बी" हैं, तो परिणाम सूचकांक मानों की एक सरणी होगी। –

2

जहां ऑब्जेक्ट का उपयोग वास्तव में धीमा होने की संभावना है, क्योंकि इसमें एक सरल ऑपरेशन के लिए पाइपलाइन शामिल है।

तेज/सबसे आसान यह है कि मैं के बारे में पता (PowerShell V2 में) करने के लिए जिस तरह से आप जानते हैं कि मूल्य में केवल एक बार होता है, तो के लिए

$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

एक का परिणाम के लिए एक चर आवंटित करने के लिए है यदि सरणी बहुत बड़ी है,

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

संक्षिप्त होने के अलावा और बात करने के लिए इस दृष्टिकोण का प्रदर्शन काफ़ी है: सरणी, [सरणी] :: indexOf() विधि जाने के लिए एक बहुत अच्छा तरीका है PowerShell cmdlet जैसे कहां ऑब्जेक्ट का उपयोग करने से बेहतर। फिर भी, यह केवल निर्दिष्ट आइटम की पहली घटना पाएगा। लेकिन जब आप अगली घटना को खोजने के लिए indexOf के अन्य अधिभार का उपयोग कर सकते हैं:

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

$ NDX हो जाएगा -1 यदि आइटम नहीं मिला है।

संबंधित मुद्दे