Array.Add बनाम + =


179

मुझे PowerShell Arrays में कुछ दिलचस्प व्यवहार मिला है, अर्थात्, यदि मैं एक सरणी घोषित करता हूं:

$array = @()

और फिर $array.Add("item")विधि का उपयोग करके इसमें आइटम जोड़ने का प्रयास करें , मुझे निम्नलिखित त्रुटि प्राप्त हुई:

अपवाद "1" को "1" तर्क के साथ जोड़ें: "संग्रह एक निश्चित आकार का था।"

हालाँकि, यदि मैं वस्तुओं का उपयोग करता हूं, तो $array += "item"आइटम को एक समस्या के बिना स्वीकार किया जाता है और "निश्चित आकार" प्रतिबंध लागू नहीं होता है।

ऐसा क्यों है?

जवाबों:


254

$array.Add()-Method का उपयोग करते समय, आप तत्व को मौजूदा सरणी में जोड़ने का प्रयास कर रहे हैं। एक सरणी निश्चित आकार का एक संग्रह है, इसलिए आपको एक त्रुटि मिलेगी क्योंकि इसे बढ़ाया नहीं जा सकता है।

$array += $elementपुराने एक + नए आइटम के समान तत्वों के साथ एक नया सरणी बनाता है , और यह नया बड़ा सरणी पुराने को बदल देता है $array-

आप किसी सरणी में एक तत्व जोड़ने के लिए + = ऑपरेटर का उपयोग कर सकते हैं। जब आप इसका उपयोग करते हैं, तो Windows PowerShell वास्तव में मूल सरणी के मान और जोड़े गए मान के साथ एक नया सरणी बनाता है। उदाहरण के लिए, $ चर में सरणी में 200 के मान के साथ एक तत्व जोड़ने के लिए, टाइप करें:

    $a += 200

स्रोत: about_Arrays

+= एक महंगा ऑपरेशन है, इसलिए जब आपको कई वस्तुओं को जोड़ने की आवश्यकता होती है, तो आपको उन्हें यथासंभव कुछ आपरेशनों में जोड़ने की कोशिश करनी चाहिए, पूर्व:

$arr = 1..3    #Array
$arr += (4..5) #Combine with another array in a single write-operation

$arr.Count
5

यदि यह संभव नहीं है, तो ( Listया ArrayListअन्य उत्तर देखें) जैसे अधिक कुशल संग्रह का उपयोग करने पर विचार करें ।


धन्यवाद :) सोचा कि यह कुछ इस तरह हो सकता है, लेकिन यह बड़े सरणियों के साथ अक्षम है, इसलिए शक्तियां टीम कुछ अलग कर रही थी।
malgca

6
यह बिल्कुल सही है, यह बड़े सरणियों के साथ अक्षम हो जाता है, दुर्भाग्य से इसके चारों ओर पाने के लिए आपको एक अलग प्रकार का उपयोग करना होगा: powershell.org/wp/2013/09/16/…
Nacht

3
निर्भर करता है। यदि आप बहुत सारे सदस्यों को जोड़ने और निकालने जा रहे हैं, तो हाँ, Listया प्रयास करें ArrayList। वे बहुत तेज हो जाएंगे। मैं व्यक्तिगत रूप से +=99% समय का उपयोग और सरणी करता हूं क्योंकि मैं आमतौर पर छोटी थ्रो-स्क्रिप्ट बनाता हूं जहां अतिरिक्त सेकंड कोई फर्क नहीं पड़ता। जहाँ मैं उपयोग करना चाहता हूँ और समय बचाने Listया बचाने के लिए बहुत सारे ऐड / रिमूवल वाली बड़ी स्क्रिप्ट्स के लिए ArrayList
फ्रोडे एफ

3
चूंकि सरणियाँ हमेशा एक निश्चित आकार की होती हैं, क्या किसी को पता है कि Add()पद्धति क्यों मौजूद है?
जॉनब्लेवन

4
क्योंकि यह विरासत में मिला है IListGet-Member -InputObject @()यह दिखाने की कोशिश करेंगेAdd Method int IList.Add(System.Object value)
फ्रॉड एफ।

113

यदि आप एक गतिशील आकार की सरणी चाहते हैं, तो आपको एक सूची बनानी चाहिए। न केवल आपको .Add()कार्यक्षमता मिलेगी , लेकिन जैसा कि @ फ्रोड-एफ बताते हैं, गतिशील सरणियां अधिक स्मृति कुशल हैं और वैसे भी एक बेहतर अभ्यास हैं।

और इसका उपयोग करना इतना आसान है।

अपनी सरणी घोषणा के बजाय, यह प्रयास करें:

$outItems = New-Object System.Collections.Generic.List[System.Object]

आइटम जोड़ना सरल है।

$outItems.Add(1)
$outItems.Add("hi")

और यदि आप वास्तव में एक सरणी चाहते हैं जब आप कर रहे हैं, तो इसके लिए एक फ़ंक्शन भी है।

$outItems.ToArray()

1
मैंने यह कोशिश की है। मैं इसे New-Object System.Collections.Generic.List [string] का उपयोग करके बनाता हूं, लेकिन फिर अगर मैं करता हूं। GetType, यह बताता है कि यह एक सरणी है।
प्रीजा 8

1
क्या आपने Add()फ़ंक्शन का उपयोग करने की कोशिश की है? मैं पुष्टि कर सकता हूं, यदि आप Listऊपर बताई गई एक सामान्य वस्तु बनाते हैं, तो आपके पास एक परिवर्तनशील सूची है, जिसके लिए आप क्रमशः Add()और Remove()विधियों का उपयोग करके आइटम जोड़ और हटा सकते हैं ।
सबसे महान

1
@ Preza8: उम्मीद के मुताबिक , मेरे लिए (New-Object System.Collections.Generic.List[string]).GetType().Nameपैदावार List`1; शायद आपने +=सूची वाले चर ( .Add()विधि को कॉल करने के बजाय ) पर लागू किया, जिस स्थिति में चर मूल्य वास्तव में एक सरणी ( System.Object[]) में परिवर्तित हो जाएगा ।
mklement0

शॉर्टकट:$a = new-object collections.generic.list[object]
एंड्रयू

4

अकुशल +=का उपयोग किए बिना एक सरणी बनाने के लिए सबसे आम मुहावरा कुछ इस तरह है, लूप के आउटपुट से:

$array = foreach($i in 1..10) { 
  $i
}
$array
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.