المصفوفات في باورشيل: أفضل الممارسات

في كثير من الأحيان عند كتابة نصوص برمجة باويرشيل، تحتاج إلى طريقة لتخزين مجموعة من العناصر. واحدة من الطرق الشائعة لتحقيق ذلك هي باستخدام مصفوفة أو نوع محدد يعرف بـ ArrayList. ولكن ما هي المصفوفة على أي حال؟ المصفوفة هي هيكل بيانات تم تصميمه لتخزين مجموعة من العناصر. يمكن أن تشمل هذه العناصر أنواعًا متماثلة أو مختلفة.

تستخدم المصفوفات في العديد من لغات البرمجة المختلفة وباويرشيل ليست استثناءً. هناك العديد من الطرق لإنشاء وتلاعب وتحسين المصفوفات. في هذه المقالة ستتعرف على ArrayLists والمصفوفات والمجموعات بالإضافة إلى بعض الممارسات الجيدة عند تطبيقها باستخدام باويرشيل.

المتطلبات المسبقة / المتطلبات

نظرًا لأنك ستعمل فقط مع لغة باويرشيل نفسها، لا توجد متطلبات بيئية. ما عليك سوى أن يكون لديك جهاز كمبيوتر يعمل بنظام التشغيل ويندوز مع باويرشيل. على وجه التحديد:

  • PowerShell لنظام التشغيل ويندوز 3 أو أحدث
  • .NET Framework 4.5 أو أحدث

هل ترغب في المزيد من النصائح مثل هذه؟ تحقق من مدونتي الشخصية لـ باويرشيل على العنوان: https://nkasco.com/FriendsOfATA

إنشاء مصفوفات باستخدام باويرشيل

هناك العديد من الطرق المختلفة لإنشاء مصفوفات باستخدام باويرشيل. لنفترض أن لديك قائمة من الأسماء التي تحتاج إلى معالجتها بطريقة ما كما هو مبين أدناه.

John
Susie
Jim
Johnny
Carrie

بناء المصفوفات عن طريق عناصر منفصلة بفواصل

أبسط طريقة يمكنك استخدامها لإنشاء مصفوفة هي ببساطة تعيين الإدخالات المعروفة المفصولة بفواصل إلى متغير كما هو مبين أدناه.

$BasicArray = "John", "Susie", "Jim", "Johnny", "Carrie"

إذا قمت بتشغيل الأمر GetType() المتاح على جميع الكائنات في PowerShell، سترى أنك قد قمت بإنشاء مصفوفة بنجاح كما يظهر في خاصية BaseType الموضحة أدناه.

PS51> $BasicArray.GetType()

IsPublic IsSerial Name                                     BaseType                                                    
-------- -------- ----                                     --------                                                    
True     True     Object[]                                 System.Array

استخدام مشغل العبارات الفرعية

يمكنك أيضًا إنشاء مصفوفات في PowerShell عبر مشغل العبارات الفرعية. يتم استخدام هذا المفهوم عادةً عند عدم معرفتك بعدد العناصر التي سيتم إضافتها إلى مصفوفتك. يمكن أن يحتوي النتيجة على صفر أو العديد من العناصر عند الإنشاء.

لاحظ أدناه أن مصفوفة تسمى $MyArray قد تم إنشاؤها بصفر عناصر داخلها.

#إنشاء مصفوفة فارغة باستخدام مشغل العبارات الفرعية
PS51> $MyArray = @()
PS51> $MyArray.count
0

استخدام مشغل النطاق

ليست المصفوفات مقتصرة على تخزين السلاسل كما هو موضح أعلاه. يمكنك أيضًا إنشاء مصفوفات باستخدام أنواع كائنات أخرى مثل الأعداد الصحيحة.

إذا كنت بحاجة إلى مصفوفة من الأعداد الصحيحة بترتيب تسلسلي، يمكنك اتخاذ اختصار واستخدام مشغل النطاق ... أدناه يمكنك رؤية مصفوفة تم إنشاؤها باستخدام الأعداد الصحيحة من 2 إلى 5 بسطر واحد من الشيفرة.

PS51> $NumberedArray = 2..5
PS51> $NumberedArray
2
3
4
5

إنشاء مجموعات ArrayList في PowerShell

يعد استخدام ArrayList في PowerShell أيضًا وسيلة يمكنك من خلالها تخزين قائمة من العناصر في PowerShell. فئة ArrayList هي جزء من فضاء أسماء System.Collections ضمن .NET. من خلال إنشاء كائن جديد من هذا النوع، يمكنك ثم تخزين الكائنات داخل ArrayList.

يمكنك رؤية أدناه أنه يتعين عليك إنشاء كائن ArrayList بشكل صريح باستخدام cmdlet New-Object أو عن طريق تحويل مصفوفة قياسية إلى كائن ArrayList.

تحتمل أن يكون BaseType في هذه الحالة كائنًا بينما الأمثلة أعلاه لديها BaseTypes من Arrays والتي تظهر الوراثة من فئة Object. في النهاية، تقدم PowerShell وصولاً إلى نظام النوع .NET.

PS51> $MyArrayList = New-Object -TypeName "System.Collections.ArrayList"
# قد تكون استبدال مصفوفة كـ ArrayList خيارًا قابلاً للتنفيذ أيضًا
PS51> $MyArrayList = [System.Collections.ArrayList]@()
PS51> $MyArrayList.GetType()

IsPublic IsSerial Name                                     BaseType                                                    
-------- -------- ----                                     --------                                                    
True     True     ArrayList                                System.Object

إضافة العناصر إلى مصفوفة

عند إنشاء مصفوفة، يمكنك إما تعريف جميع العناصر في وقت الإنشاء أو إضافتها حسب الحاجة.

لإضافة عناصر إلى مجموعة موجودة، يمكنك استخدام مشغل += أو طريقة Add. ولكن اعلم أن هناك فروقًا كبيرة في كيفية عملها.

عند إنشاء مصفوفة قياسية بـ @()، ستستخدم مشغل += ولكن لإضافة عناصر إلى ArrayList، ستستخدم طريقة Add. تختلف هذه الطرق في أن مشغل += في الواقع يدمر المصفوفة الحالية ويقوم بإنشاء واحدة جديدة مع العنصر الجديد.

لتوضيح ذلك، سترى أدناه يمكنك الرجوع إلى خاصية IsFixedSize لمصفوفة أو ArrayList لمعرفة ما إذا كانت لا تتغير أم تتغير.

PS51> $BasicArray.IsFixedSize
True

PS51> $MyArrayList.IsFixedSize
False

نظرًا لأن المصفوفة الأساسية هي مجموعة ذات حجم ثابت، فلا يمكنك تعديلها.

محاولة استخدام الطريقة Add() مع مصفوفة ذات حجم ثابت ستؤدي إلى حدوث خطأ بسبب الحجم الثابت. فيما يلي بعض الأمثلة التي يمكنك فيها إضافة عناصر بنجاح إلى مصفوفة.

#لا يعمل
$BasicArray.Add("Nate")

#يعمل
$BasicArray += "Nate"
$MyArrayList.Add("Nate")
$MyArrayList += "Nate"

إزالة العناصر من مصفوفة

الآن بعد أن لديك فهمًا أفضل لكيفية إضافة العناصر إلى مصفوفة، دعنا نغطي بعض الطرق التي يمكنك من خلالها إزالة العناصر من مصفوفة.

نظرًا لأن المصفوفة الأساسية ثابتة، فلا يمكنك إزالة العناصر منها. بدلاً من ذلك، عليك إنشاء مصفوفة جديدة تمامًا. على سبيل المثال، يمكنك إزالة عنصر واحد من مصفوفة عن طريق إنشاء عبارة شرطية تطابق فقط تلك العناصر التي ترغب في تضمينها. يُظهر المثال أدناه.

$NewBasicArray = $BasicArray -ne "Nate"

نظرًا لأن ArrayList ليست ثابتة، يمكنك إزالة العناصر منها باستخدام الطريقة Remove(). هذا هو سيناريو واحد يمكن أن يفيدك في استخدام ArrayList إذا كنت تخطط لإضافة/إزالة العناصر بشكل متكرر.

$MyArrayList.Remove("Nate")

استرجاع عناصر محددة من مصفوفة أو ArrayList

لاسترجاع عناصر محددة من مصفوفة أو ArrayList، يمكنك استخدام العديد من الطرق المختلفة. مثل أشياء أخرى في PowerShell، يمكنك الوصول إلى جميع عناصر المصفوفة ببساطة عن طريق استدعاء الكائن.

PS51> $BasicArray
John
Susie
Jim
Johnny
Carrie

ربما تحتاج إلى استرجاع العنصر الأول فقط، حيث تحتوي المصفوفات دائمًا على مصدر يبدأ من 0 يمثل العنصر الأول في المصفوفة. لاسترجاع العنصر الأول من مصفوفة، حدد رقم المؤشر في الأقواس كما هو موضح أدناه.

PS51> $BasicArray[0]
John

بالعكس ، يمكنك أيضًا الإشارة إلى الفهارس بشكل عكسي باستخدام علامة الشرطة (مؤشر سلبي) لاستدعاء آخر عدد X من العناصر من المصفوفة. الطريقة الشائعة للعثور على العنصر الأخير في مصفوفة هي باستخدام -1 كما هو موضح أدناه.

PS51> $BasicArray[-1]
Carrie

يمكن استخدام مشغل النطاق الذي تعلمته أعلاه أيضًا لاسترداد كائنات من مصفوفة عن طريق اتباع نفس الطريقة لاستدعاء العناصر. لنفترض أنك تريد استرداد الأسماء الأربع الأولى في مصفوفة $BasicArray.

يمكنك أن ترى أدناه يمكنك تحديد نطاق من الفهارس 0-3 الذي سيعيد العناصر الأربعة الأولى.

PS51> $BasicArray[0..3]
John
Susie
Jim
Johnny

تحسين المصفوفات باستخدام PowerShell

الآن بعد أن لديك أساس جيد لكيفية إنشاء وتلاعب المصفوفات ، أيهما يجب عليك استخدامه؟ للإجابة على ذلك ، دعونا نمر ببعض الأمثلة مع Measure-Command cmdlet. باستخدام cmdlet Measure-Command ، ستفهم بشكل أفضل كم من الوقت يستغرق المراحل بينما يتم تمرير العناصر.

بشكل عام ، إذا كان لديك مجموعة صغيرة من الكائنات ، فمن المحتمل أنك لن تلاحظ الفرق كثيرًا في كيفية تلاعبك بالمصفوفات. ومع ذلك ، إذا كان لديك مجموعة كبيرة من الكائنات ، من المهم فهم الاختلافات لتحقيق النتائج المثلى.

لنقم بتطبيق ما تعلمته للتو في القسم السابق حول الفرق بين += واستخدام الطريقة Add() مع حلقة من 50،000 عنصر.

أولاً، قم بإنشاء مصفوفة فارغة و ArrayList فارغة كما هو موضح أدناه.

PS51> $MyArray = @()
PS51> $MyArrayList = [System.Collections.ArrayList]@()

بعد ذلك، قم بملء 50,000 عنصر في كل مجموعة باستخدام مشغل المدى وحلقة foreach كما هو موضح أدناه.

@(0..50000).foreach({$MyArray += $_})
@(0..50000).foreach({$MyArrayList.Add($_)})

وأخيرًا، قم بتغليف الأوامر الخاصة بك في تعبير وقم بتمرير هذا التعبير إلى cmdlet Measure-Command. عن طريق تنفيذ التعبير باستخدام cmdlet Measure-Command، يمكنك رؤية كم يستغرق كل عملية فعليًا للتنفيذ.

تذكر أنه كما تعلمت من قبل، + = ينشئ في الواقع مصفوفة جديدة بدلاً من إلحاقها بمصفوفة ثابتة.

PS51> Measure-Command -Expression {@(0..50000).foreach({$MyArray += $_})}
Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 59
Milliseconds      : 58
Ticks             : 590585963
TotalDays         : 0.000683548568287037
TotalHours        : 0.0164051656388889
TotalMinutes      : 0.984309938333333
TotalSeconds      : 59.0585963
TotalMilliseconds : 59058.5963

PS51> Measure-Command -Expression {@(0..50000).foreach({$MyArrayList.Add($_)})}
Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 139
Ticks             : 1399989
TotalDays         : 1.62035763888889E-06
TotalHours        : 3.88885833333333E-05
TotalMinutes      : 0.002333315
TotalSeconds      : 0.1399989
TotalMilliseconds : 139.9989

النتيجة؟ ما يقرب من 60 ثانية مقابل 139 مللي ثانية!

كما يمكنك رؤية، فإنه من الأسرع بكثير استغلال ArrayList لمجموعات كبيرة بدلاً من استخدام مصفوفة ذات حجم ثابت.

على الرغم من أن هذا مثال بسيط، إلا أنه يشدد على أهمية فهم ما يقوم به كودك أثناء المعالجة. إذا لم يتم فهمه بشكل صحيح، يمكن أن يؤدي ذلك إلى تجربة مستخدم سيئة.

إذا كان لديك أي سيناريو قائم يمكن أن يستفيد من استخدام ArrayList بدلاً من مصفوفة، فهذا سيمثل فرصة رائعة لإجراء تحسين على مدار الليل!

Further Reading

ترغب في المزيد من النصائح مثل هذه؟ تحقق من مدونتي الشخصية حول PowerShell على: https://nkasco.com/FriendsOfATA.

Source:
https://adamtheautomator.com/powershell-array/