C# - Non-Generic Collections

 

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

المجموعات غير العامة (Non-Generic Collections) في C# هي مجموعات يمكنها تخزين أنواع بيانات مختلفة داخل نفس القائمة أو الهيكل، حيث يتم التعامل مع جميع العناصر ككائنات (Objects).
هذه المجموعات موجودة في System.Collections، لكنها أصبحت أقل استخدامًا بعد ظهور المجموعات العامة (Generic Collections) التي توفر أداءً أفضل وأمانًا نوعيًا (Type Safety).



📌 أشهر المجموعات غير العامة في C#

1️⃣ ArrayList

🔹 وصف:
قائمة ديناميكية يمكنها تخزين عناصر من أنواع مختلفة وتغيير حجمها تلقائيًا عند الإضافة أو الحذف.

🔹 مثال:

using System;
using System.Collections;
class Program
{
static void Main()
{
ArrayList myList = new ArrayList();
myList.Add(10);
myList.Add("Hello");
myList.Add(3.14);
foreach (var item in myList)
{
Console.WriteLine(item);
}
}
}

المشكلة:

  • لا تدعم Type Safety، مما قد يؤدي إلى أخطاء أثناء التنفيذ.
  • يحتاج إلى تحويل (Casting) عند استرجاع القيم، مما يقلل الأداء.

🔹 البديل الحديث: List<T>


2️⃣ Hashtable

🔹 وصف:
هيكل بيانات Key-Value يقوم بتخزين القيم مع مفاتيح فريدة.

🔹 مثال:

using System;
using System.Collections;
class Program
{
static void Main()
{
Hashtable myTable = new Hashtable();
myTable["Name"] = "Mahmoud";
myTable["Age"] = 30;
myTable["Country"] = "Egypt";
foreach (DictionaryEntry entry in myTable)
{
Console.WriteLine(entry.Key + ": " + entry.Value);
}
}
}

المشكلة:

  • أبطأ من Dictionary<TKey, TValue> لأنه يستخدم Object Boxing/Unboxing.
  • لا يوجد Type Safety، مما قد يؤدي إلى أخطاء أثناء التشغيل.

🔹 البديل الحديث: Dictionary<TKey, TValue>


3️⃣ Stack (LIFO)

🔹 وصف:

  • بنية بيانات تعتمد على LIFO (Last In, First Out)، حيث يتم إضافة العناصر وإزالتها من نفس الطرف.

🔹 مثال:

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

🔹 البديل الحديث: Stack<T>


4️⃣ Queue (FIFO)

🔹 وصف:

  • بنية بيانات تعتمد على FIFO (First In, First Out)، حيث يتم إضافة العناصر من الخلف وإزالتها من المقدمة.

🔹 مثال:

using System;
using System.Collections;
class Program
{
static void Main()
{
Queue myQueue = new Queue();
myQueue.Enqueue("First");
myQueue.Enqueue("Second");
myQueue.Enqueue("Third");
Console.WriteLine(myQueue.Dequeue()); // يزيل "First"
Console.WriteLine(myQueue.Peek()); // يعرض "Second" بدون إزالته
}
}

🔹 البديل الحديث: Queue<T>


5️⃣ SortedList

🔹 وصف:

  • تخزن البيانات كمفتاح-قيمة (Key-Value) ولكنها تحافظ على ترتيب المفاتيح تلقائيًا.

🔹 مثال:

using System;
using System.Collections;
class Program
{
static void Main()
{
SortedList mySortedList = new SortedList();
mySortedList["B"] = "Banana";
mySortedList["A"] = "Apple";
mySortedList["C"] = "Cherry";
foreach (DictionaryEntry entry in mySortedList)
{
Console.WriteLine(entry.Key + ": " + entry.Value);
}
}
}

🔹 البديل الحديث: SortedList<TKey, TValue>



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

الميزة Non-Generic Collections Generic Collections
الأداء أبطأ (لأنه يستخدم Object) أسرع (بفضل T)
Type Safety ❌ لا يوجد ✅ موجود
التحويل (Casting) مطلوب عند الاسترجاع غير مطلوب
التخزين يمكن تخزين أي نوع بيانات يخزن فقط T
المجموعات الحديثة ArrayList, Hashtable, Stack, Queue, SortedList List<T>, Dictionary<TKey, TValue>, Stack<T>, Queue<T>


📌 متى تستخدم Non-Generic Collections؟

✅ عندما تعمل على مشاريع قديمة متوافقة مع .NET Framework 1.0/1.1.
✅ إذا كنت تتعامل مع كائنات من أنواع مختلفة في نفس القائمة.
✅ عند الحاجة إلى دعم التوافقية مع بعض المكتبات القديمة.

🚀 لكن يفضل دائمًا استخدام المجموعات العامة (Generic Collections) لتحسين الأداء والأمان.


💡 هل لديك أي استفسارات أخرى حول Non-Generic Collections؟ 😊

تعليقات

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

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

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

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