هنتكلم عن نوع بيانات مهم جدًا في 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 بقى، الموضوع بيكون مرن أكتر في حاجتين أساسيتين:
- المرونة في الحجم: مش محتاج تحدد حجم معين من الأول. ArrayList بتزيد حسب الحاجة طول ما في مساحة في الذاكرة.
- المرونة في نوع البيانات: تقدر تخزن أي نوع بيانات، مش بس نوع محدد زي الأرقام أو النصوص.
الـ 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 لأنها بتكون أكثر أمانًا وأسرع.