نص شرح المعلم والكود الذي كتبه ونتيجة تشغيله، بنفس ترتيب الدرس.
مفهوم مجموعات البيانات في C# (Data Collections) 📚 المشكلة الحقيقية: تخيل وجود 1000 طالب في المنصة؛ هل ننشئ 1000 متغير منفصل؟ مستحيل! الحل البرمجي: بنية بيانات واحدة تجمع عناصر متعددة من نفس النوع تحت اسم متغير واحد. أنواع المجموعات الأساسية: المصفوفات الثابتة (Arrays) والقوائم الديناميكية المرنة (Lists). المصفوفات الثابتة وحجم الذاكرة (Fixed-Size Arrays) 📦 التعريف: حجز مساحة متجاورة في الذاكرة لتخزين عدد محدد مسبقاً من نفس النوع. الحجم الثابت (Fixed Size): بمجرد إنشاء المصفوفة بحجم معين، لا يمكن تكبيرها أو تصغيرها نهائياً. التحديد بالحجم: مثل كود int[] scores = new int[5]; التحديد بالقيم المباشرة: مثل كود string[] fruits = { "تفاح", "موز", "برتقال" }; الفهرسة الصفرية وتعديل العناصر (Zero-Based Indexing) 0️⃣ قاعدة الفهرس الصفري: أول عنصر في المصفوفة مكانه دائماً 0، والعنصر الأخير رقمه Length - 1. قراءة العناصر: مثل string firstFruit = fruits[0]; التعديل المباشر: مثل fruits[1] = "مانجو"; لتغيير العنصر الثاني فوراً في نفس المكان. طول المصفوفة الإجمالي: خاصية fruits.Length ترجع عدد العناصر الكلي داخل المصفوفة. دوال فئة المصفوفات الجاهزة (Built-in Array Methods) 🛠️ ترتيب العناصر تصاعدياً: دالة Array.Sort(scores); ترتب الأرقام من الأصغر للأكبر. عكس ترتيب العناصر: دالة Array.Reverse(scores); لقلب الترتيب ليصبح تنازلياً. البحث عن مكان عنصر: دالة Array.IndexOf(scores, 85); ترجع رقم الفهرس أو -1 إن لم تجده. مسح وتصفير العناصر: Array.Clear(scores, 0, 2); لتصفير عناصر محددة وإعادتها لقيمتها الافتراضية. القوائم الديناميكية المرنة (Dynamic List<T>) 🌟 البطل الحقيقي للمشاريع: القائمة List<T> تنتمي لمكتبة System.Collections.Generic. الميزة الكبرى (Dynamic Sizing): قائمة مرنة تكبر وتصغر تلقائياً؛ تضيف وتحذف عناصر دون أي قيود! تعريف القائمة: كود List<string> students = new List<string>(); أهم دوال الإضافة في القوائم (List Adding Operations) ➕ الإضافة في النهاية: دالة students.Add("أحمد"); لإضافة عنصر وتوسيع القائمة تلقائياً. الإدراج في مكان محدد: دالة students.Insert(1, "سارة"); لوضع عنصر في أي مكان وإزاحة البقية. التوسيع التلقائي للذاكرة: القائمة تضاعف سعتها في الذاكرة كلما امتلأت دون تدخل منك. الحذف والفحص في القوائم (Searching & Count) 🔍 فحص وجود العنصر: دالة students.Contains("عمر"); ترجع true لو كان العنصر موجوداً. الحذف بالقيمة: دالة students.Remove("أحمد"); تبحث عن أول ظهور للقيمة وتحذفها. الحذف بالفهرس: دالة students.RemoveAt(0); لحذف العنصر الموجود في مكان محدد مباشرة. إفراغ القائمة بالكامل: students.Clear(); لحذف جميع العناصر وتصفير القائمة. عدد العناصر الفعلي: خاصية students.Count تُرجع عدد العناصر الحالية (وليس Length!). أهم دوال الإضافة في القوائم (List Adding Operations) ➕ الإضافة في النهاية: دالة students.Add("أحمد"); لإضافة عنصر وتوسيع القائمة تلقائياً. الإدراج في مكان محدد: دالة students.Insert(1, "سارة"); لوضع عنصر في أي مكان وإزاحة البقية. التوسيع التلقائي للذاكرة: القائمة تضاعف سعتها في الذاكرة كلما امتلأت دون تدخل منك. الحذف والفحص في القوائم (Searching & Count) 🔍 فحص وجود العنصر: دالة students.Contains("عمر"); ترجع true لو كان العنصر موجوداً. الحذف بالقيمة: دالة students.Remove("أحمد"); تبحث عن أول ظهور للقيمة وتحذفها. الحذف بالفهرس: دالة students.RemoveAt(0); لحذف العنصر الموجود في مكان محدد مباشرة. إفراغ القائمة بالكامل: students.Clear(); لحذف جميع العناصر وتصفير القائمة. عدد العناصر الفعلي: خاصية students.Count تُرجع عدد العناصر الحالية (وليس Length!). مقارنة حاسمة: متى تختار Array ومتى List؟ (Array vs List) ⚖️ متى تختار Array: عندما يكون عدد العناصر ثابتاً ومحدداً سلفاً ولا يتغير أبداً (مثل أيام الأسبوع 7). متى تختار List: في 90% من تطبيقات العالم الواقعي؛ كسلة المشتريات، المنشورات، وقوائم المستخدمين. كفاءة الذاكرة: المصفوفة أسرع قليلاً وتستهلك ذاكرة أقل، بينما القائمة توفر مرونة مطلقة. أشهر فخاخ التعامل مع المجموعات (Collections Pitfalls) 🛑 فخ الخروج عن الحدود (IndexOutOfRange): محاولة طلب عنصر برقم فهرس غير موجود مما يسبب انهيار الكود! فخ الخلط بين Length و Count: استخدام Length مع القائمة أو Count مع المصفوفة يسبب خطأ تجميع. فخ الحذف داخل حلقة foreach: محاولة حذف عنصر من قائمة أثناء التكرار عليها بحلقة foreach يسبب خطأ فوري؛ استخدم حلقة for.