C# - Generic Collections

 

🔹 المجموعات العامة في C# (Generic Collections)

المجموعات العامة (Generic Collections) هي أنواع بيانات قابلة لإعادة الاستخدام تتيح تخزين البيانات بطريقة آمنة نوعيًا (Type-Safe)، مما يعني أنها تعمل مع نوع بيانات محدد عند إنشائها، وبالتالي توفر أداءً أفضل وتقلل الحاجة إلى عمليات التحويل (Casting).

📌 المجموعات العامة موجودة في System.Collections.Generic.


🎯 لماذا نستخدم Generic Collections؟

تحسين الأداء: لأن النوع معروف أثناء الـ Compilation، مما يلغي الحاجة إلى Boxing/Unboxing عند التعامل مع الأنواع القيمية مثل int.
أمان نوعي (Type-Safety): لا يمكن إضافة نوع بيانات غير متوقع، مما يقلل الأخطاء.
سهولة القراءة والصيانة: لا تحتاج إلى عمليات تحويل Casting عند استرجاع القيم.


📌 أنواع المجموعات العامة في C#

1️⃣ List<T> (قائمة ديناميكية)

🔹 وصف:
تعتبر List<T> البديل الحديث لـ ArrayList. وهي قائمة ديناميكية تسمح بإضافة وإزالة العناصر بسهولة.

🔹 مثال:

using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<string> names = new List<string>();
names.Add("Mahmoud");
names.Add("Ali");
names.Add("Sara");
foreach (string name in names)
{
Console.WriteLine(name);
}
}
}

✅ الميزات:
✔ تدعم الفهرسة (Indexing) مثل المصفوفات.
✔ يمكن تعديل الحجم تلقائيًا عند الإضافة أو الحذف.


2️⃣ Dictionary<TKey, TValue> (قاموس مفتاح-قيمة)

🔹 وصف:
Dictionary<TKey, TValue> هو هيكل بيانات لتخزين القيم باستخدام مفاتيح فريدة، ويُعتبر البديل لـ Hashtable.

🔹 مثال:

using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Dictionary<int, string> students = new Dictionary<int, string>();
students.Add(1, "Omar");
students.Add(2, "Ayman");
students.Add(3, "Noor");
Console.WriteLine(students[1]); // طباعة "Omar"
foreach (var pair in students)
{
Console.WriteLine($"ID: {pair.Key}, Name: {pair.Value}");
}
}
}

✅ الميزات:
✔ البحث سريع جدًا عبر المفاتيح.
✔ لا يسمح بتكرار المفاتيح (Unique Keys).


3️⃣ Queue<T> (الطابور FIFO)

🔹 وصف:
Queue<T> هي بنية بيانات تعتمد على FIFO (First In, First Out)، مما يعني أن العنصر الأول الذي يدخل هو الأول الذي يخرج.

🔹 مثال:

using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Queue<string> tasks = new Queue<string>();
tasks.Enqueue("Task 1");
tasks.Enqueue("Task 2");
tasks.Enqueue("Task 3");
Console.WriteLine(tasks.Dequeue()); // يزيل "Task 1"
Console.WriteLine(tasks.Peek()); // يعرض "Task 2" بدون إزالته
}
}

✅ الميزات:
✔ ممتاز لإدارة قوائم الانتظار (مثل الطباعة، والطلبات في الخدمات).
✔ يدعم Enqueue() للإضافة و Dequeue() للحذف.


4️⃣ Stack<T> (المكدس LIFO)

🔹 وصف:
Stack<T> تعمل بطريقة LIFO (Last In, First Out)، حيث يتم إضافة وإزالة العناصر من نفس الطرف.

🔹 مثال:

using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
Stack<string> history = new Stack<string>();
history.Push("Page 1");
history.Push("Page 2");
history.Push("Page 3");
Console.WriteLine(history.Pop()); // يزيل "Page 3"
Console.WriteLine(history.Peek()); // يعرض "Page 2" بدون إزالته
}
}

✅ الميزات:
✔ يستخدم في التراجع (Undo) والتنقل في المتصفح.


5️⃣ SortedList<TKey, TValue> (قائمة مفروزة)

🔹 وصف:
SortedList<TKey, TValue> تعمل مثل Dictionary<TKey, TValue>، لكنها تحافظ تلقائيًا على ترتيب المفاتيح.

🔹 مثال:

using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
SortedList<int, string> employees = new SortedList<int, string>();
employees.Add(3, "Hassan");
employees.Add(1, "Mahmoud");
employees.Add(2, "Alaa");
foreach (var employee in employees)
{
Console.WriteLine($"ID: {employee.Key}, Name: {employee.Value}");
}
}
}

✅ الميزات:
✔ أسرع من Dictionary<TKey, TValue> عند الحاجة إلى الترتيب الدائم.
✔ يدعم الفهرسة مثل List<T>.


6️⃣ HashSet<T> (مجموعة بدون تكرار)

🔹 وصف:
HashSet<T> تشبه List<T> لكنها لا تسمح بتكرار العناصر.

🔹 مثال:

using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
HashSet<int> uniqueNumbers = new HashSet<int>();
uniqueNumbers.Add(1);
uniqueNumbers.Add(2);
uniqueNumbers.Add(3);
uniqueNumbers.Add(1); // لن يتم إضافته لأنه مكرر
foreach (int number in uniqueNumbers)
{
Console.WriteLine(number);
}
}
}

✅ الميزات:
✔ أداء سريع جدًا عند البحث عن القيم.
✔ يمنع التكرار تلقائيًا.



📌 مقارنة بين المجموعات العامة

المجموعة نوعها تدعم الفهرسة تدعم المفاتيح تسمح بتكرار القيم مميزاتها
List<T> عامة ✅ نعم ❌ لا ✅ نعم بديل لـ ArrayList
Dictionary<TKey, TValue> عامة ❌ لا ✅ نعم ❌ لا سريع جدًا في البحث
Queue<T> عامة ❌ لا ❌ لا ✅ نعم FIFO
Stack<T> عامة ❌ لا ❌ لا ✅ نعم LIFO
SortedList<TKey, TValue> عامة ✅ نعم ✅ نعم ✅ نعم يحافظ على الترتيب
HashSet<T> عامة ❌ لا ❌ لا ❌ لا يمنع التكرار


🎯 متى تستخدم كل نوع؟

إذا كنت تحتاج إلى قائمة مرنة ➝ استخدم List<T>.
إذا كنت تحتاج إلى البحث بمفتاح-قيمة ➝ استخدم Dictionary<TKey, TValue>.
إذا كنت تحتاج إلى ترتيب تلقائي حسب المفتاح ➝ استخدم SortedList<TKey, TValue>.
إذا كنت تحتاج إلى طابور انتظار ➝ استخدم Queue<T>.
إذا كنت تحتاج إلى تراجع وتنفيذ Undo ➝ استخدم Stack<T>.
إذا كنت تحتاج إلى قائمة بدون تكرار ➝ استخدم HashSet<T>.


تعليقات

المشاركات الشائعة من هذه المدونة

HTML - Text Formatting تنسيقات النص

HTML - ملخص شامل لأهم التاجات

HTML - Youtube videos تضمين فيديوهات اليوتيوب