هل C# مناسبة لهياكل البيانات والخوارزميات؟
نعم. فهي تشبه Java كثيراً في قراءتها: الأنواع تجعل كل عقدة ومرجع ومعامل نوع عام (generic) صريحاً، وSystem.Collections.Generic تغطي معظم هياكل هذا المسار. وهناك عادتان تستحقان أن تكتسبهما مبكراً. فـ LINQ موجزة، لكن كل OrderBy عملية ترتيب وكل Where حلقة، لذا تُخفي التكاليف التي تتعلم كيف تحسبها؛ وArray.Sort غير مستقر، وهذا مهم كلما وجب أن تحافظ المفاتيح المتساوية على ترتيبها.
أي مجموعات .NET تقابل أي هياكل بيانات؟
List<T> مصفوفة ديناميكية، وStack<T> وQueue<T> قائمتان على مصفوفات، وLinkedList<T> قائمة مترابطة مزدوجة، وDictionary<TKey,TValue> وHashSet<T> جداول تجزئة، وSortedDictionary<TKey,TValue> وSortedSet<T> أشجار أحمر-أسود، متوازنة مثل شجرة AVL التي تبنيها في الخطوة الثانية. أما SortedList<TKey,TValue> فزوج من المصفوفات يُحفَظ مرتباً حسب المفتاح، ومنذ .NET 6 تتوفر PriorityQueue<TElement,TPriority>، وهي كومة صغرى قائمة على مصفوفة. ولا يوجد صنف لشجرة البادئات أو للرسم البياني؛ فهذان تكتبهما بنفسك.
هل ينبغي أن تكون عقدة الشجرة أو القائمة صنفاً (class) أم بُنية (struct) في C#؟
صنفاً. فالـ struct نوع قيمة (value type): لا يمكن أن يحتوي على حقل من نوعه هو إطلاقاً، وحيثما نُسخ، فإن تغيير النسخة لا يمسّ الأصل. أما كائن الصنف فمرجع، لذا تستطيع العقد أن تشير إحداها إلى الأخرى كما تحتاج القائمة المترابطة أو الشجرة. واحتفظ بالبُنى للقيم الصغيرة، مثل إحداثية في شبكة أو حافة موزونة.
هل في C# طابور أولوية؟
منذ .NET 6 نعم: PriorityQueue<TElement,TPriority>، وهي كومة صغرى قائمة على مصفوفة، يُضاف إليها كل عنصر مع أولويته الخاصة؛ ومرّر IComparer<TPriority> يعكس الترتيب لتحصل على كومة عظمى. أما .NET Framework وبيئات التشغيل الأقدم فليس فيها طابور أولوية، ولهذا ظل مطورو C# طويلاً يكتبون كومتهم بأنفسهم أو يطوّعون SortedSet<T> لتؤدي دورها، ولهذا ما زالت القدرة على كتابة كومة مهمة. وفي الخطوة الثانية تكتبها.
ما الدورات في هذا المسار التي لا تُدرَّس بلغة C#؟
ثلاث دورات. البرمجة الديناميكية وسلسلة مقابلات Python تُدرَّسان بلغة Python، وعمليات البتات بلغة C++. وتجدها مُدرجة بعد الخطوات، ولكل منها رابط يفتحها بلغتها. جدول النتائج المحفوظة في C# مصفوفة أو Dictionary، وحيل البتات تنتقل كما هي، حتى في التمييز الذي تضعه C++: فالمعامل >> يحافظ على الإشارة مع int ويملأ بالأصفار مع uint.
هل أحتاج إلى معرفة C# قبل بدء هذا المسار؟
الأصناف والدوال والمصفوفات والحلقات والمجموعات العامة مثل List<T> على الأقل. إن كانت هذه جديدة عليك، فدورة C# من Coddy توصلك إلى ذلك أولاً مجاناً، ويبدأ هذا المسار من حيث تنتهي.