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>.
تعليقات
إرسال تعليق