অ্যারে। বনাম + = যোগ করুন


179

পাওয়ারশেল অ্যারেগুলিতে আমি কিছু আকর্ষণীয় আচরণ পেয়েছি, যথা, যদি আমি কোনও অ্যারে হিসাবে ঘোষণা করি:

$array = @()

এবং তারপরে $array.Add("item")পদ্ধতিটি ব্যবহার করে এতে আইটেম যুক্ত করার চেষ্টা করুন , আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

"1" আর্গুমেন্ট (গুলি) সহ "যুক্ত করুন" কল করা ব্যতিক্রম: "সংগ্রহটি একটি নির্দিষ্ট আকারের ছিল" "

তবে, আমি যদি আইটেমগুলি ব্যবহার করে সংযোজন করি তবে $array += "item"কোনও সমস্যা ছাড়াই আইটেমটি গৃহীত হবে এবং "নির্দিষ্ট আকারের" বিধিনিষেধ প্রয়োগ হবে বলে মনে হয় না।

কেন?

উত্তর:


254

$array.Add()-ধর্মী ব্যবহার করার সময়, আপনি বিদ্যমান অ্যারেতে উপাদানটি যুক্ত করার চেষ্টা করছেন। একটি অ্যারে স্থির আকারের সংগ্রহ, সুতরাং আপনি ত্রুটি পাবেন কারণ এটি বাড়ানো যায় না।

$array += $elementপুরানো ও নতুন আইটেমের মতো একই উপাদানগুলির সাথে একটি নতুন অ্যারে তৈরি করে এবং এই নতুন বৃহত্তর অ্যারেটি $arrayপুরানোটির পরিবর্তিত হয়

আপনি অ্যারেতে একটি উপাদান যুক্ত করতে + = অপারেটরটি ব্যবহার করতে পারেন। আপনি যখন এটি ব্যবহার করেন, উইন্ডোজ পাওয়ারশেল আসলে মূল অ্যারের মান এবং যুক্ত মান সহ একটি নতুন অ্যারে তৈরি করে। উদাহরণস্বরূপ, ভ্যারিয়েবলের অ্যারেতে 200 এর মান সহ একটি উপাদান যুক্ত করতে, টাইপ করুন:

    $a += 200

সূত্র: সম্পর্কে_আরাইস

+= একটি ব্যয়বহুল ক্রিয়াকলাপ, সুতরাং আপনার যখন অনেকগুলি আইটেম যুক্ত করার দরকার হয় তখন এগুলি যতটা সম্ভব অপারেশনগুলিতে যুক্ত করার চেষ্টা করা উচিত, যেমন:

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

$arr.Count
5

যদি এটি সম্ভব না হয় তবে এর মতো আরও দক্ষ সংগ্রহ ব্যবহার করার বিষয়ে বিবেচনা করুন Listবা ArrayList(অন্য উত্তরটি দেখুন)।


ধন্যবাদ :) ভেবেছিল এটি এ জাতীয় কিছু হতে পারে তবে ভেবেছিল এটি বড় অ্যারেতে অক্ষম হবে, সুতরাং পাওয়ারশেল দলটি কিছু আলাদা করছে doing
malgca

6
যে ঠিক ঠিক আছে, এটা বড় অ্যারে সঙ্গে অদক্ষ হয়ে, দুর্ভাগ্যবশত কাছাকাছি পেতে এই আপনি একটি ভিন্ন ধরনের ব্যবহার করতে হবে: powershell.org/wp/2013/09/16/...
Nacht

3
এটা নির্ভর করে. আপনি যোগ এবং তারপর হ্যাঁ সদস্যদের অনেকটা অপসারণ করতে যাচ্ছি, তাহলে চেষ্টা Listবা ArrayList। এগুলি আরও দ্রুত হবে। আমি ব্যক্তিগতভাবে +=সময়টি 99% ব্যবহার করি এবং অ্যারে করি কারণ আমি সাধারণত শর্ট থ্রো-অ্যাও স্ক্রিপ্ট তৈরি করি যেখানে অতিরিক্ত সেকেন্ডের কিছু আসে যায় না। যেখানে আমি নিখুত চান অ্যাড / Remove প্রচুর সঙ্গে বড় স্ক্রিপ্টের জন্য এবং সময় বাঁচাতে আমি ব্যবহার Listবা ArrayList
ফ্রয়েড এফ।

3
অ্যারে যেমন সর্বদা একটি স্থির আকারের হয়, কেউ কি জানেন যে কেন Add()পদ্ধতিটি বিদ্যমান?
এলবেভান

4
কারণ এটি উত্তরাধিকার সূত্রে প্রাপ্ত IList। চেষ্টা করুন Get-Member -InputObject @()এটি দেখাবেAdd Method int IList.Add(System.Object value)
ফ্রিড এফ।

113

আপনি যদি গতিশীল আকারের অ্যারে চান তবে আপনার একটি তালিকা তৈরি করা উচিত। কেবলমাত্র আপনি .Add()কার্যকারিতা পাবেন না , তবে @ ফ্রয়েড-এফ ব্যাখ্যা করেছেন যে, গতিশীল অ্যারেগুলি আরও মেমরি দক্ষ এবং যাইহোক আরও ভাল অনুশীলন are

এবং এটি ব্যবহার করা এত সহজ।

আপনার অ্যারে ঘোষণার পরিবর্তে এটি চেষ্টা করুন:

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

আইটেম যুক্ত করা সহজ।

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

এবং আপনি যখন কাজটি সম্পন্ন করার সময় যদি সত্যিই একটি অ্যারে চান তবে তার জন্য একটি ফাংশনও রয়েছে।

$outItems.ToArray()

1
আমি এই চেষ্টা করেছি। আমি এটিকে নিউ-অবজেক্ট সিস্টেম ব্যবহার করে তৈরি করেছি Col সংগ্রহগুলি en জেনেরিক.লিস্ট [স্ট্রিং] তবে তারপরে যদি আমি করি GGTType, এটি আমাকে এটি অ্যারে বলে।
Preza8

1
আপনি কি Add()ফাংশনটি ব্যবহার করার চেষ্টা করেছেন ? আমি নিশ্চিত করতে পারি, আপনি যদি Listউপরে বর্ণিত হিসাবে জেনেরিক অবজেক্ট তৈরি করেন তবে আপনার কাছে একটি পরিবর্তনীয় তালিকা রয়েছে যার জন্য আপনি যথাক্রমে Add()এবং Remove()পদ্ধতিগুলি ব্যবহার করে আইটেমগুলি যুক্ত করতে এবং মুছে ফেলতে পারবেন ।
পানোত্সব গরিষ্ঠ

1
@ প্রেজা 8: প্রত্যাশামতো আমার জন্য (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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.