الخوارزميات وهياكل البيانات في C#: أساس لكتابة كود .NET فعال
في التطوير الحديث على منصة .NET، تُعد معرفة الخوارزميات وهياكل البيانات مهارة أساسية لبناء تطبيقات عالية الأداء وقابلة للتوسع. سواء كنت تكتب خدمات ويب باستخدام ASP.NET Core، أو تطبيقات سطح مكتب باستخدام WPF، أو حلولاً للهواتف المحمولة باستخدام Xamarin، فإن الاختيار الصحيح لهيكل البيانات يؤثر بشكل مباشر على سرعة البرنامج واستهلاكه للذاكرة. في هذا المقال، سنستعرض هياكل البيانات والخوارزميات الرئيسية في لغة C#، مع أمثلة عملية لكل قسم.
1. هياكل البيانات الأساسية في C#: المصفوفات والقوائم
لنبدأ من الأساسيات. في C#، هناك عدة أنواع مدمجة لتخزين المجموعات، وفهم آلية عملها الداخلية أمر بالغ الأهمية.
المصفوفات (Array)
المصفوفة هي تسلسل ثابت من العناصر من نفس النوع. توفر أسرع وصول حسب الفهرس (O(1))، لكنها لا تسمح بتغيير الحجم بعد الإنشاء.
int[] numbers = new int[5] { 10, 20, 30, 40, 50 };// الوصول حسب الفهرسint thirdElement = numbers[2]; // 30// تغيير عنصرnumbers[3] = 100;استخدم المصفوفات عندما يكون عدد العناصر معروفاً مسبقاً ولن يتغير (مثلاً لتخزين الثوابت أو المخازن المؤقتة الثابتة).
القائمة (List<T>)
List<T> هي مصفوفة ديناميكية. تتوسع تلقائياً عند إضافة عناصر جديدة. داخلياً، تستخدم مصفوفة عادية يتم إعادة إنشائها عند تجاوز السعة.
List<string> fruits = new List<string>();fruits.Add("تفاح");fruits.Add("موز");fruits.Add("برتقال");Console.WriteLine(fruits.Count); // 3fruits.RemoveAt(1); // حذف "موز"List<T> هو الخيار العام لمعظم المهام التي تتطلب وصولاً تسلسلياً وتغييرات متكررة في حجم المجموعة.
2. المكدس والطابور: مبادئ LIFO و FIFO
يطبق هذان الهيكلان قواعد صارمة لإضافة واستخراج العناصر. لا غنى عنهما في تحليل التعبيرات، ومعالجة المهام المؤجلة، وتنفيذ خوارزميات الاجتياز.
المكدس (Stack<T>)
يعمل المكدس وفق مبدأ "آخر من يدخل هو أول من يخرج" (LIFO). في .NET، يتم تنفيذ المكدس كمجموعة عامة.
Stack<int> stack = new Stack<int>();stack.Push(1);stack.Push(2);stack.Push(3);
int top = stack.Pop(); // 3int peek = stack.Peek(); // 2 (بدون حذف)مثال واقعي: التحقق من صحة الأقواس في سلسلة نصية أو تنفيذ زر "الرجوع" في المتصفح.
الطابور (Queue<T>)
يتبع الطابور مبدأ "أول من يدخل هو أول من يخرج" (FIFO). هذا هو الخيار المثالي لمعالجة المهام حسب ترتيب وصولها.
Queue<string> queue = new Queue<string>();queue.Enqueue("المهمة 1");queue.Enqueue("المهمة 2");queue.Enqueue("المهمة 3");
string task = queue.Dequeue(); // "المهمة 1"string nextTask = queue.Peek(); // "المهمة 2"تُستخدم الطوابير بنشاط في أنماط Producer-Consumer، ومعالجة الرسائل، وأنظمة التسجيل.
3. الأشجار والخوارزميات التكرارية في C#
الأشجار هي هياكل هرمية حيث يمكن لكل عقدة أن تحتوي على عدة عقد فرعية. تحتل أشجار البحث الثنائية (BST) مكانة خاصة، حيث توفر بحثاً وإدراجاً وحذفاً سريعاً (O(log n) في المتوسط).
تنفيذ شجرة بحث ثنائية
public class TreeNode{ public int Value; public TreeNode Left; public TreeNode Right;
public TreeNode(int value) { Value = value; }}
public class BinarySearchTree{ public TreeNode Root;
public void Insert(int value) { Root = InsertRec(Root, value); }
private TreeNode InsertRec(TreeNode root, int value) { if (root == nu