الـ Collections تعتبر مفهوم شبيه جدًا بالـ Arrays، لكنها بتوفر مرونة أكبر في التعامل مع مجموعات من الـ objects.
Introduction to Collections
ببساطة، الـ Collections هي مجموعات من السجلات أو العناصر اللي بنقدر نتعامل معاها كوحدة منطقية واحدة.
على سبيل المثال، ممكن يكون عندك:
- مجموعة دول (Country Collection)، كل عنصر فيها هو بلد بالكود والاسم بتاعه.
- مجموعة منتجات (Product Collection)، كل عنصر فيها هو منتج بالـ ID والاسم بتاعه.
- مجموعة كتب (Book Collection)، كل عنصر فيها هو كتاب برقم الـ ISBN والاسم بتاعه.

General Categories of Collections
الـ Collections بتتصنف بشكل عام لأربع فئات رئيسية، كل فئة ليها طريقة مختلفة في الوصول للعناصر.

graph TD A[Collections] --> B[Indexed Based]; A --> C[Key-Value Pair]; A --> D[Prioritized]; A --> E[Specialized]; B --> B1[Array]; B --> B2[List / ArrayList]; C --> C1[Hashtable]; C --> C2[Dictionary]; C --> C3[SortedList]; D --> D1["Stack (LIFO)"]; D --> D2["Queue (FIFO)"]; E --> E1[HybridDictionary];
Indexed Based Collections
دي مجموعات بتعتمد على الـ index عشان نوصل للعناصر، زي الـ Array والـ List. لما بنضيف أي عنصر، الـ framework بيديله index داخلي مترقم تلقائيًا بنستخدمه عشان نحدد العنصر ده.

Key-Value Pair Collections
في المشاريع الحقيقية، نادرًا ما بنستخدم الـ index الداخلي. غالبًا بنبقى محتاجين نستخدم “مفتاح” (key) معين عشان نوصل للبيانات. هنا بيجي دور الـ Key-Value Pair collections زي Hashtable و Dictionary و SortedList، اللي كل عنصر فيها بيكون عبارة عن مفتاح وقيمة مرتبطة بيه.

Prioritized Collections
النوع ده بيساعدنا نوصل للعناصر بترتيب معين ومحدد مسبقًا. أشهر مثالين هما:
- الـ Queue (FIFO): اختصار لـ
First-In, First-Out. اللي بيدخل الأول بيخرج الأول، زي طابور العيش بالظبط. - الـ Stack (LIFO): اختصار لـ
Last-In, First-Out. اللي بيدخل الآخر هو اللي بيخرج الأول، زي كومة كتب فوق بعضها.

Specialized Collections
دي أنواع متخصصة جدًا ومصممة لهدف معين. مثال عليها الـ HybridDictionary اللي بيبدأ كـ List ولما عدد العناصر يكبر بيتحول تلقائيًا لـ Hashtable عشان يحسن الأداء.
What are Arrays and Their Disadvantages in C#?
زي ما عرفنا قبل كدة، الـ Arrays هي هياكل بيانات بسيطة بتخزن عناصر من نفس النوع ورا بعض. ورغم إنها شائعة، إلا إن ليها عيوب كبيرة:
-
الحجم ثابت (Fixed Size): لازم تحدد حجم الـ
Arrayوإنت بتنشئه. لو احتجت تغير الحجم بعد كدة، لازم تعملarrayجديدة وتنسخ كل العناصر القديمة فيها، ودي عملية مكلفة في الأداء. حتى لو استخدمتArray.Resize()، هو في الحقيقة بيعمل نفس الموضوع ده في الخلفية. -
صعوبة التعديل: صعب جدًا تضيف أو تحذف عنصر من نص الـ
Arrayمن غير ما تحتاج تعمل إزاحة لكل العناصر اللي بعده.
عشان نحل المشاكل دي، ظهرت الـ Collections في C#.
What is a Collection in C#?
ببساطة، الـ Collection في C# هي dynamic array. هي فئة من الـ classes الجاهزة اللي بتوفرها C# في الـ namespace اللي اسمه System.Collections، وبتدينا إمكانيات أكبر من الـ Arrays.
الـ Collections بتحل مشاكل الـ Arrays عن طريق المميزات دي:
- حجمها ممكن يزيد وينقص ديناميكيًا حسب الحاجة.
- بتوفر
methodsجاهزة عشان نضيف عنصر في أي مكان. - بتوفر
methodsجاهزة عشان نحذف عنصر من أي مكان بسهولة.
باختصار، الـ Collections بتدينا كل الأدوات اللي محتاجينها عشان نعمل عمليات مختلفة على مجموعات من الـ objects زي التخزين، التعديل، الحذف، البحث، والترتيب.
Types of Collections in C#
فيه 3 طرق أو namespaces أساسية للتعامل مع الـ Collections في C#.

Non-Generic Collections (System.Collections)
دي الـ collections القديمة اللي ظهرت مع C# 1.0.
- الميزة: بتتعامل مع أي نوع بيانات لأنها بتشتغل على
object. - العيب: مش
type-safe، يعني ممكن بالغلط تضيف أنواع مختلفة في نفس الـcollectionوده ممكن يسببruntime errors.
أشهر الـ classes اللي فيها:
- الـ
ArrayList: هيArrayديناميكي الحجم. - الـ
Stack: تطبيق لمبدأLIFO. - الـ
Queue: تطبيق لمبدأFIFO. - الـ
Hashtable: مجموعةKey/Value pairsغير مرتبة. - الـ
SortedList: مجموعةKey/Value pairsمرتبة بالـkey.
Generic Collections (System.Collections.Generic)
دي النسخة الأحدث والأكثر استخدامًا، وظهرت مع C# 2.0.
- الميزة:
type-safe، يعني بنحدد نوع البيانات اللي الـcollectionهتشتغل عليه من الأول (List<string>)، وده بيمنع أخطاء الأنواع وبيحسن الأداء لأنه بيتجنب عمليات الـboxing/unboxing.
أشهر الـ classes اللي فيها:
- الـ
List<T>: البديل الـtype-safeللـArrayList. - الـ
Stack<T>: النسخة الـtype-safeمنStack. - الـ
Queue<T>: النسخة الـtype-safeمنQueue. - الـ
Dictionary<TKey, TValue>: البديل الـtype-safeللـHashtable. - الـ
HashSet<T>: مجموعة بتخزن عناصر فريدة من غير تكرار. - الـ
SortedList<TKey, TValue>،SortedSet<T>،SortedDictionary<TKey, TValue>: نسخ مرتبة. - الـ
LinkedList<T>: تطبيق لهيكل البياناتDoubly Linked List.
Concurrent Collections (System.Collections.Concurrent)
دي ظهرت في .NET Framework 4.0 عشان تحل مشاكل الـ multi-threading.
- الميزة:
thread-safe، يعني ينفع أكتر منthreadيستخدم نفس الـcollectionفي نفس الوقت من غير ما تحصل مشاكل في تناسق البيانات.
أشهر الـ classes اللي فيها:
BlockingCollection<T>ConcurrentBag<T>ConcurrentStack<T>ConcurrentQueue<T>ConcurrentDictionary<TKey, TValue>