البرنامج التعليمي لـ C# ArrayList مع أمثلة

⚡ ملخص ذكي

ArrayList في لغة C# عبارة عن مجموعة ديناميكية من مساحة اسم System.Collections تخزن العناصر ككائنات. على عكس المصفوفة، فإنها تتوسع وتتقلص أثناء التشغيل ويمكنها استيعاب الأعداد الصحيحة والسلاسل النصية والقيم المنطقية معًا في قائمة واحدة.

  • 🔄 التحجيم الديناميكي: تقوم ArrayList بإضافة وإزالة العناصر في وقت التشغيل، لذلك لا يمكنك تحديد عدد العناصر مسبقًا كما هو الحال في المصفوفة.
  • 📦 تخزين الكائن: يتم تخزين كل عنصر ككائن، مما يسمح لقائمة ArrayList واحدة باحتواء أنواع بيانات مختلطة مثل int و string و bool.
  • الأساليب الأساسية: تغطي عمليات الإضافة والإدراج والإزالة والإزالة عند واحتواء وفرز العمليات اليومية على ArrayList.
  • 📊 العدد والسعة: خاصية Count تُرجع العدد الحالي للعناصر، بينما خاصية Capacity هي مساحة التخزين المخصصة.
  • الخيار العصري: Microsoft يوصي باستخدام القائمة العامة للتعليمات البرمجية الجديدة لأنها تضيف أمانًا لأنواع البيانات في وقت الترجمة وتتجنب التغليف.
  • 🤖 مساعدة الذكاء الاصطناعي: يقوم GitHub Copilot بإنشاء أكواد ArrayList، وتقوم خطوط أنابيب ML.NET بتمرير البيانات من خلال أنواع مجموعات C#.

قائمة المصفوفات في لغة C#

ما هو ArrayList في C #؟

مجموعة ArrayList تشبه إلى المصفوفات نوع البيانات في C#. الاختلاف الأكبر هو الطبيعة الديناميكية لمجموعة قائمة المصفوفة.

بالنسبة للمصفوفات، تحتاج إلى تحديد عدد العناصر التي يمكن للمصفوفة أن تحتوي عليها في وقت إعلان المصفوفة. ولكن في حالة مجموعة Array List، لا يلزم القيام بذلك مسبقًا. يمكن إضافة عناصر أو إزالتها من مجموعة Array List في أي وقت. دعنا نلقي نظرة على العمليات المتاحة لمجموعة Array List بمزيد من التفصيل.

إعلان قائمة المصفوفة

يتم توفير إعلان ArrayList أدناه. يتم إنشاء قائمة مصفوفة بمساعدة نوع بيانات ArrayList. يتم استخدام الكلمة الأساسية "جديدة" لإنشاء كائن من قائمة ArrayList. ثم يتم تعيين الكائن إلى المتغير a1. والآن سيتم استخدام المتغير a1 للوصول إلى العناصر المختلفة لقائمة المصفوفات.

ArrayList a1 = new ArrayList()

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

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

ArrayList.add(element)

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

يمكنك أدناه رؤية أمثلة لكيفية إضافة سلاسل Integer وحتى القيم المنطقية إلى مجموعة Array List.

  • a1.add(1) - سيؤدي هذا إلى إضافة قيمة عددية إلى المجموعة
  • a1.add("مثال") - سيؤدي هذا إلى إضافة قيمة سلسلة إلى المجموعة
  • a1.add(true) - سيؤدي هذا إلى إضافة قيمة منطقية إلى المجموعة

الآن دعونا نرى هذا يعمل على مستوى الكود. ستتم كتابة كافة التعليمات البرمجية المذكورة أدناه إلى تطبيق وحدة التحكم لدينا. ستتم كتابة الكود في ملف Program.cs الخاص بنا.

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

قائمة المصفوفات في C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   ArrayList a1 = new ArrayList();
   a1.Add(1);
   a1.Add("Example");
   a1.Add(true);
   
   Console.WriteLine(a1[0]);	  
   Console.WriteLine(a1[1]);
   Console.WriteLine(a1[2]);
   Console.ReadKey();
  }
 }
}

Code تفسير:-

  1. يتم استخدام الخطوة الأولى للإعلان عن قائمة المصفوفات الخاصة بنا. نعلن هنا عن a1 كمتغير للاحتفاظ بعناصر قائمة المصفوفات الخاصة بنا.
  2. نستخدم بعد ذلك الكلمة الأساسية add لإضافة الرقم 1 والسلسلة "مثال" والقيمة المنطقية "صحيح" إلى قائمة المصفوفات.
  3. نستخدم بعد ذلك طريقة Console.WriteLine لعرض قيمة كل عنصر يسرد المصفوفة على وحدة التحكم. ستلاحظ أنه تمامًا مثل المصفوفات، يمكننا الوصول إلى العناصر عبر مواضع الفهرس الخاصة بها. لذا، للوصول إلى الموضع الأول في قائمة المصفوفات، نستخدم موضع الفهرس [0]. وهلم جرا وهكذا دواليك.

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

الإخراج:

قائمة المصفوفات في C#

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

دعونا نلقي نظرة على بعض الطرق الإضافية المتوفرة كجزء من ArrayList.

العد التنازلي

يتم استخدام هذه الطريقة للحصول على عدد العناصر الموجودة في مجموعة ArrayList. وفيما يلي بناء الجملة العام لهذا البيان.

ArrayList.Count() - ستعيد هذه الطريقة عدد العناصر التي تحتوي عليها قائمة المصفوفة.

يحتوي

يتم استخدام هذه الطريقة لمعرفة ما إذا كان هناك عنصر موجود في مجموعة ArrayList. وفيما يلي بناء الجملة العام لهذا البيان

ArrayList.Contains(element) – ستُرجع هذه الطريقة صحيحًا إذا كان العنصر موجودًا في القائمة، وإلا فإنها ستعيد خطأ.

إزالة في

يتم استخدام هذه الطريقة لإزالة عنصر في موضع محدد في مجموعة ArrayList. وفيما يلي بناء الجملة العام لهذا البيان

ArrayList.RemoveAt(index) - ستقوم هذه الطريقة بإزالة عنصر من موضع معين في قائمة المصفوفات.

الآن دعونا نرى هذا يعمل على مستوى الكود. ستتم كتابة كافة التعليمات البرمجية المذكورة أدناه إلى تطبيق وحدة التحكم لدينا. ستتم كتابة الكود في ملف Program.cs الخاص بنا.

في البرنامج أدناه، سنكتب الكود لنرى كيف يمكننا استخدام الطرق المذكورة أعلاه.

قائمة المصفوفات في C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   ArrayList a1 = new ArrayList();
   a1.Add(1);
   a1.Add("Example");
   a1.Add(true);
   
   Console.WriteLine(a1.Count);
   Console.WriteLine(a1.Contains(2));
   Console.WriteLine(a1[1]);
   a1.RemoveAt(1);
   Console.WriteLine(a1[1]);
   Console.ReadKey();
  }
 }
}

Code تفسير:-

  1. لذا فإن الخاصية الأولى التي نراها هي خاصية الكونت. نحن نحصل على خاصية Count لقائمة المصفوفة a1 ثم نكتبها إلى وحدة التحكم.
  2. في الجزء الثاني، نستخدم الأسلوب يحتوي على معرفة ما إذا كانت ArrayList a1 تحتوي على العنصر 2. ثم نكتب النتيجة إلى وحدة التحكم عبر أمر Writeline.
  3. أخيرًا، لعرض طريقة إزالة العنصر، نقوم بالخطوات التالية:
    1. أولاً، نكتب قيمة العنصر في موضع الفهرس 1 من قائمة المصفوفات إلى وحدة التحكم.
    2. ثم نقوم بإزالة العنصر الموجود في موضع الفهرس 1 من قائمة المصفوفات.
    3. أخيرًا، نكتب مرة أخرى قيمة العنصر في موضع الفهرس 1 من قائمة المصفوفات إلى وحدة التحكم. ستعطي مجموعة الخطوات هذه فكرة جيدة عما إذا كانت طريقة الإزالة ستعمل كما ينبغي.

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

الإخراج:

قائمة المصفوفات في C#

لماذا القيمة الأخيرة صحيحة؟

إذا رأيت تسلسل الأحداث، فسيتم إزالة العنصر مثال من المصفوفة لأنه موجود في الموضع 1. ثم يتم استبدال الموضع 1 من المصفوفة بما كان في الموضع 2 سابقًا والذي تكون القيمة "صحيحة"

كيفية تكرار عناصر قائمة ArrayList في لغة C#

قراءة كل عنصر من عناصر ArrayList مهمة شائعة. ولأن ArrayList يخزن عناصره ككائنات، يمكنك الوصول إليها باستخدام حلقة foreach أو حلقة for تستخدم خاصية Count. تُعد حلقة foreach أبسط طريقة، إذ تتنقل بين كل عنصر بالترتيب دون الحاجة إلى فهرس.

يُنشئ المثال أدناه قائمة من السلاسل النصية ويطبع كل قيمة في سطر منفصل. كُتب الكود في ملف Program.cs الخاص بتطبيق وحدة تحكم.

الخطوة 1) قم باستيراد مساحة الاسم System.Collections وقم بإنشاء ArrayList بثلاثة عناصر.

الخطوة 2) استخدم حلقة foreach لقراءة كل عنصر ككائن وكتابته إلى وحدة التحكم.

using System;
using System.Collections;

namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   ArrayList a1 = new ArrayList();
   a1.Add("Java");
   a1.Add("Python");
   a1.Add("Kotlin");
   foreach (object item in a1)
   {
    Console.WriteLine(item);
   }
   Console.ReadKey();
  }
 }
}

Code تفسير:-

  1. يتم استيراد مساحة الاسم System.Collections بحيث يكون نوع ArrayList متاحًا للبرنامج.
  2. تتم إضافة ثلاث قيم نصية إلى قائمة ArrayList باستخدام طريقة الإضافة.
  3. تقوم حلقة foreach بقراءة كل عنصر ككائن، وتقوم طريقة Console.WriteLine بطباعته على سطر جديد.

عند تشغيل البرنامج، يقوم بطباعة Java, Pythonو كوتلن على أسطر منفصلة. ستعطي حلقة for مع خاصية Count نفس النتيجة مع السماح لك أيضًا باستخدام موضع فهرس كل عنصر.

طرق وخصائص ArrayList في لغة C#

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

فريقنا الوصف
إضافة يضيف عنصرًا واحدًا إلى نهاية قائمة المصفوفة.
إدراج يضيف عنصرًا في موضع فهرس محدد.
حذف يزيل أول ظهور لعنصر معين.
إزالة في يزيل العنصر الموجود في موضع الفهرس المحدد.
امسح يزيل جميع العناصر من قائمة ArrayList.
تصنيف حسب: يرتب العناصر بترتيب تصاعدي.
Reverse Reverseترتيب العناصر في القائمة.
يحتوي تُرجع القيمة "صحيح" إذا كان العنصر المحدد موجودًا في القائمة.
مؤشر يُعيد موضع فهرس عنصر مُحدد.
العد التنازلي خاصية تُرجع عدد العناصر المخزنة.
السعة خاصية تُرجع عدد العناصر التي يمكن أن تحتويها القائمة.

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

الفرق بين ArrayList و List في لغة C#

كل من ArrayList و generic قائمة تُخزّن هذه الأنواع مجموعة من العناصر التي قد تتوسع أثناء التشغيل، إلا أنها تختلف في كيفية تعاملها مع أنواع البيانات. معرفة هذا الاختلاف يُساعدك على اختيار النوع الأنسب لبرمجة C# الحديثة.

فيما يلي أبرز الاختلافات:

  • أمان النوع: تقوم ArrayList بتخزين كل عنصر ككائن، بينما ترتبط List بنوع واحد معلن ويتم التحقق منها في وقت الترجمة.
  • الأداء: تقوم ArrayList بتغليف وفك تغليف أنواع القيم مثل int، مما يكلف وقتًا، بينما تتجنب List التغليف لتحقيق سرعة أفضل.
  • مساحة الاسم: يوجد ArrayList في System.Collections، بينما يوجد List في System.Collections.Generic.
  • الصب: غالباً ما تتطلب القراءة من ArrayList تحويلاً إلى النوع الأصلي، لكن List تُرجع النوع الصحيح مباشرةً.
  • التوصية: Microsoft يوصي باستخدام List للتطوير الجديد لأنه أكثر أمانًا وسرعة وسهولة في القراءة.

باختصار، يعتبر ArrayList مفيدًا لفهم التعليمات البرمجية القديمة أو التخزين المختلط الأنواع، بينما تعتبر List الخيار المفضل لمعظم التطبيقات اليوم.

الأسئلة الشائعة

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

لم تتم إزالة ArrayList، ولكن Microsoft لا يُنصح باستخدامه في التطويرات الجديدة. يُفضّل استخدام فئة List العامة في System.Collections.Generic لأنها تُضيف أمانًا للأنواع وأداءً أفضل، لذا فإن معظم أكواد C# الحديثة تستخدم List بدلاً من ذلك.

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

تدعم قائمة ArrayList عدة قارئات في آنٍ واحد، ولكن لا يُضمن أمان عناصرها في بيئة متعددة الخيوط عند تعديل المجموعة. ولضمان أمان عمليات الكتابة متعددة الخيوط، يُنصح بتغليفها بقائمة ArrayList.Syncاستخدم طريقة متزامنة أو مجموعة متزامنة بدلاً من ذلك.

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

يمكنك نسخ العناصر إلى قائمة ذات نوع محدد باستخدام دالتي Cast و ToList، أو استدعاء دالة ToArray للحصول على مصفوفة كائنات. يُعد التحويل إلى قائمة عامة أمرًا شائعًا لأنه يُعيد سلامة النوع.

نعم. يستطيع GitHub Copilot كتابة تعريفات ArrayList، وإضافة الاستدعاءات وحذفها، وإنشاء الحلقات من خلال تعليق قصير أو اسم دالة. كما أنه غالبًا ما يقترح استخدام إصدار List العام، لأنه المجموعة الموصى بها لكتابة أكواد C# الجديدة.

يقرأ ML.NET عادةً بيانات التدريب من خلال مجموعات عامة مثل List وIEnumerable، والتي تُطابق مسار IDataView الخاص به. نادرًا ما يُستخدم ArrayList غير العام مباشرةً لأن المجموعة ذات النوع المحدد بدقة تحافظ على بيانات التعلم الآلي واضحة وآمنة من حيث النوع.

تلخيص هذه التدوينة بـ: