الخوارزميات وهياكل البيانات في C#: من النظرية إلى التطبيق
فهم الخوارزميات وهياكل البيانات هو أساس التطوير الاحترافي في C#. بغض النظر عما إذا كنت تكتب تطبيق ويب عالي التحميل على ASP.NET Core أو تطبيق سطح مكتب على WPF، فإن اختيار هيكل البيانات الصحيح والخوارزمية الفعالة يؤثر بشكل مباشر على الأداء، وقابلية القراءة، وقابلية التوسع للكود. في هذه المقالة، سنقوم بتحليل هياكل البيانات والخوارزميات الرئيسية من خلال أمثلة محددة لكود C# يمكنك تطبيقها فوراً في مشاريعك.
1. الكومة (Stack) والطابور (Queue) في C#
الكومة (LIFO — Last In, First Out) والطابور (FIFO — First In, First Out) هما هيكلان أساسيان للبيانات مدمجان في .NET ويستخدمان على نطاق واسع في المهام الواقعية: من معالجة استدعاءات الدوال إلى إدارة المهام.
الكومة في C#
غالباً ما تُستخدم الكومة لتنفيذ التراجع عن الإجراءات (undo) أو التحليل النحوي. في C#، يتم تمثيل الكومة بواسطة الفئة Stack<T>.
using System;using System.Collections.Generic;
public class StackExample{ public static void Main() { Stack<string> browserHistory = new Stack<string>(); // إضافة العناصر (Push) browserHistory.Push("الصفحة الرئيسية"); browserHistory.Push("الأخبار"); browserHistory.Push("مقال عن C#"); Console.WriteLine($"آخر صفحة: {browserHistory.Peek()}"); // مقال عن C# // إزالة وإرجاع العنصر العلوي (Pop) string lastPage = browserHistory.Pop(); Console.WriteLine($"نعود من: {lastPage}"); // مقال عن C# Console.WriteLine($"الصفحة الحالية: {browserHistory.Peek()}"); // الأخبار }}الطابور في C#
الطابور مثالي لمعالجة المهام حسب ترتيب وصولها (مثل طابور الطباعة أو معالجة الرسائل). استخدم الفئة Queue<T>.
using System;using System.Collections.Generic;
public class QueueExample{ public static void Main() { Queue<string> printQueue = new Queue<string>(); // إضافة إلى نهاية الطابور (Enqueue) printQueue.Enqueue("المستند1.pdf"); printQueue.Enqueue("صورة.png"); printQueue.Enqueue("التقرير.docx"); Console.WriteLine($"الأول في الطباعة: {printQueue.Peek()}"); // المستند1.pdf // إزالة من بداية الطابور (Dequeue) string firstJob = printQueue.Dequeue(); Console.WriteLine($"جارٍ الطباعة: {firstJob}"); // المستند1.pdf Console.WriteLine($"التالي: {printQueue.Peek()}"); // صورة.png }}هام: في .NET يوجد أيضاً ConcurrentQueue<T> للسيناريوهات متعددة الخيوط، وStack<T> لا يدعم الوصول بالفهرس — فقط القمة.
2. فرز المصفوفة: الفرز السريع (QuickSort)
على الرغم من وجود طريقة مدمجة Array.Sort() في C#، إلا أن فهم خوارزميات الفرز ضروري للمقابلات والتحسين. الفرز السريع هو واحد من أكثر الخوارزميات فعالية بتعقيد O(n log n) في الحالة المتوسطة.
using System;
public class QuickSortExample{ public static void QuickSort(int[] arr, int left, int right) { if (left < right) { int pivotIndex = Partition(arr, left, right); QuickSort(arr, left, pivotIndex - 1); QuickSort(arr, pivotIndex + 1, right); } }
private static int Partition(int[] arr, int left, int right) { int pivot = arr[right]; // العنصر المحوري — الأخير int i = left - 1;
for (int j = left; j < right; j++) { if (arr[j] < pivot) { i++;