الخوارزميات وهياكل البيانات بلغة C#: دليل عملي مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

الخوارزميات وهياكل البيانات بلغة C#: تطبيق عملي

\n\n

فهم الخوارزميات وهياكل البيانات هو مهارة أساسية لأي مطور. سواء كنت تكتب خدمة عالية التحميل، تطبيق سطح مكتب، أو لعبة، فإن إدارة البيانات بكفاءة تؤثر بشكل مباشر على أداء وقابلية التوسع في كودك. في هذه المقالة، سنستعرض هياكل البيانات والخوارزميات الرئيسية بلغة C# (.NET) مع أمثلة عملية يمكنك تطبيقها فورًا في مشاريعك.

\n\n

1. المصفوفات الديناميكية والعمل مع List<T>

\n\n

في لغة C#، المصفوفة الديناميكية الأساسية هي الفئة List<T>. على عكس المصفوفة التقليدية، فهي تتوسع تلقائيًا عند إضافة العناصر. دعنا نستعرض عملياتها الرئيسية وأحد أهمها - البحث الثنائي.

\n\n

البحث الثنائي (Binary Search) يعمل فقط على البيانات المرتبة. تعقيده هو O(log n). تقوم الخوارزمية بتقسيم نطاق البحث إلى نصفين في كل خطوة.

\n\n
using System;\nusing System.Collections.Generic;\n\npublic class BinarySearchExample\n{\n    public static int BinarySearch(List<int> sortedList, int target)\n    {\n        int left = 0;\n        int right = sortedList.Count - 1;\n\n        while (left <= right)\n        {\n            int mid = left + (right - left) / 2;\n\n            if (sortedList[mid] == target)\n                return mid; // تم العثور على العنصر، نعيد الفهرس\n            else if (sortedList[mid] < target)\n                left = mid + 1; // ابحث في النصف الأيمن\n            else\n                right = mid - 1; // ابحث في النصف الأيسر\n        }\n        return -1; // لم يتم العثور على العنصر\n    }\n\n    public static void Main()\n    {\n        var numbers = new List<int> { 2, 5, 8, 12, 16, 23, 38, 45, 56, 67 };\n        int target = 23;\n        int result = BinarySearch(numbers, target);\n        Console.WriteLine(result != -1 ? $"تم العثور على العنصر {target} في الفهرس {result}" : "لم يتم العثور على العنصر");\n    }\n}
\n\n

لماذا هذا مهم؟ يتم استخدام List<T> في 90% من المشاريع. القدرة على البحث بسرعة فيه هي مفتاح الأداء.

\n\n

2. المكدس والطابور: LIFO و FIFO عمليًا

\n\n

المكدس (Stack) والطابور (Queue) هما مجموعتان بترتيب وصول محدد بوضوح. لا غنى عنهما في معالجة الاستدعاءات، التحليل النحوي، والعمل مع المهام.

\n\n

المكدس (LIFO — Last In, First Out)

\n

يُستخدم، على سبيل المثال، للتحقق من صحة الأقواس في الكود.

\n\n
using System;\nusing System.Collections.Generic;\n\npublic class StackExample\n{\n    public static bool IsValidBrackets(string input)\n    {\n        Stack<char> stack = new Stack<char>();\n        foreach (char ch in input)\n        {\n            if (ch == '(' || ch == '{' || ch == '[')\n            {\n                stack.Push(ch);\n            }\n            else if (ch == ')' || ch == '}' || ch == ']')\n            {\n                if (stack.Count == 0) return false;\n\n                char top = stack.Pop();\n                if ((ch == ')' && top != '(') ||\n                    (ch == '}' && top != '{') ||\n                    (ch == ']' && top != '['))\n                {\n                    return false;\n                }\n            }\n        }\n        return stack.Count == 0;\n    }\n\n    public static void Main()\n    {\n        string test1 = "({[]})";\n        string test2 = "({[})";\n        Console.WriteLine($"'{test1}' — أقواس صحيحة: {IsValidBrackets(test1)}");\n        Console.WriteLine($"'{test2}' — أقواس صحيحة: {IsValidBrackets(test2)}");\n    }\n}
\n\n

الطابور (FIFO — First In, First Out)

\n

مثالي لمعالجة المهام بترتيب وصولها (مثل طابور الطباعة).

\n\n
using System;\nusing System.Collections.Generic;\n\npublic class QueueExample\n{\n    public static void Main()\n    {\n                

المدونات

توصيات الكتب