الـ 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 هي هياكل بيانات بسيطة بتخزن عناصر من نفس النوع ورا بعض. ورغم إنها شائعة، إلا إن ليها عيوب كبيرة:

  1. الحجم ثابت (Fixed Size): لازم تحدد حجم الـ Array وإنت بتنشئه. لو احتجت تغير الحجم بعد كدة، لازم تعمل array جديدة وتنسخ كل العناصر القديمة فيها، ودي عملية مكلفة في الأداء. حتى لو استخدمت Array.Resize()، هو في الحقيقة بيعمل نفس الموضوع ده في الخلفية.

  2. صعوبة التعديل: صعب جدًا تضيف أو تحذف عنصر من نص الـ 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>