هنتكلم عن نوع بيانات مهم جدًا في C# اسمه ArrayList. النوع ده قد يكون مش جديد في لغة السي شارب، لكنه جديد بالنسبة لك لو لسه مبتدئ.

الـ ArrayList بتساعدك إنك تتعامل مع مجموعة من العناصر بمرونة أكتر من الـ Array العادية، وبتديك مميزات هنتكلم عنها في التفاصيل.

إيه الفرق بين Array و ArrayList؟

خلينا نفتكر مع بعض Array العادية اللي خدناها قبل كده، كنا بنحتاج نحدد حجمها وعدد العناصر اللي هنخزنها فيها من الأول، وكمان لازم نحدد نوع العناصر (Data Type) اللي هنخزنها جواها.

مثال على Array:

int[] numbers = new int[3];
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;

في ArrayList بقى، الموضوع بيكون مرن أكتر في حاجتين أساسيتين:

  1. المرونة في الحجم: مش محتاج تحدد حجم معين من الأول. ArrayList بتزيد حسب الحاجة طول ما في مساحة في الذاكرة.
  2. المرونة في نوع البيانات: تقدر تخزن أي نوع بيانات، مش بس نوع محدد زي الأرقام أو النصوص.

الـ ArrayList بتعمل إيه؟

الـ ArrayList مش strongly typed، يعني مش مضطرة تحدد نوع البيانات اللي هتحطها فيها من الأول.

ده لأن أي حاجة هتتحط فيها بيتم تحويلها لنوع object.

مثال على ArrayList:

ArrayList list = new ArrayList();
list.Add(1);
list.Add("Test");
list.Add(true);

في المثال ده، حطينا أرقام، نصوص، وBoolean، وكل ده من غير ما نحدد نوع البيانات اللي بنخزنها.

إضافة عناصر في ArrayList

ممكن تضيف عناصر فردية أو حتى مجموعات من العناصر مرة واحدة باستخدام AddRange الـ AddRange بتاخد Cs Interface اسمه ICollection فيه معظم الـ List Types بيستخدموه

مثال:

list.Add(42); // إضافة عنصر واحد
list.AddRange(new int[] { 10, 20, 30 }); // إضافة مجموعة من العناصر
  • هي من النوع Cs Enumerable فعشان كدا تقدر تعمل عليها Loops براحتك
foreach (var item in list) // var or object (not any type else)
	Console.WriteLine(item)

الوصول للعناصر والـ Index

تقدر توصل لأي عنصر في ArrayList عن طريق Index بنفس طريقة الـ Array.

Console.WriteLine(list[0]); // هتطبع 1
Console.WriteLine(list[1]); // هتطبع "Test"

إزالة عناصر من ArrayList

عندك أكتر من طريقة تقدر بيها تشيل عناصر من ArrayList:

  • Remove: بتشيل أول عنصر بيطابق القيمة اللي بتحددها.
  • RemoveAt: بتشيل العنصر اللي في مكان معين (index).
  • RemoveRange: بتشيل مجموعة من العناصر في دفعة واحدة.
list.Remove(1); // هتشيل العنصر اللي قيمته 1
list.RemoveAt(0); // هتشيل أول عنصر
list.RemoveRange(0, 3); // هتشيل أول 3 عناصر
// (index, count)

البحث في ArrayList

لو عايز تدور على مكان عنصر معين في ArrayList، ممكن تستخدم IndexOf اللي بترجع مكان العنصر.

int index = list.IndexOf("Test");
Console.WriteLine(index); // هتطبع 1
// تقدر تديله انديكس يبدأ تدوير منه
Console.WriteLine(list.IndexOf("Test", 2)) // -1

الفرق بين Add و Insert

  • Add: دايمًا بتحط العنصر في آخر القائمة.
  • Insert: بتحط العنصر في مكان معين.

مثال على Insert:

list.Insert(2, "New Value");

هنا حطينا “New Value” في المكان اللي رقمه 2.

Boxing and Unboxing in ArrayList

نرجع دلوقتي لموضوع مهم جدًا، وهو Cs Boxing and Unboxing.

Boxing

لما تحط أي نوع بيانات في ArrayList (زي int أو double)، بيتحول لنوع Object تلقائيًا، وده بنسميه Boxing.

int x = 5;
object obj = x; // Boxing

Unboxing

لما تيجي تسترجع البيانات اللي كانت مخزنة، لازم تعمل عملية Unboxing عشان ترجع القيمة الأصلية.

object obj = 5;
int x = (int)obj; // Unboxing

التأثير على الأداء (Performance)

عمليات Boxing و Unboxing ممكن تأثر على الأداء (Performance)، لأنها بتتطلب عمليات إضافية في الذاكرة.

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

الخلاصة

الـ ArrayList بتميزها المرونة في التعامل مع الأنواع المختلفة من البيانات بدون الحاجة لتحديد النوع من البداية أو الحجم، لكن لازم نفهم إن التعامل معاها بيستخدم Boxing و Unboxing اللي بيأثروا على الأداء.

في تطبيقات معينة، ممكن تفضل استخدام Generic List لأنها بتكون أكثر أمانًا وأسرع.