البرنامج التعليمي لمجموعات C# مع أمثلة

⚡ ملخص ذكي

توفر المجموعات في لغة C# طريقة مرنة لتخزين وإدارة مجموعات من الكائنات. على عكس المصفوفات، تتوسع المجموعات وتتقلص أثناء التشغيل، وتوفر مساحات الأسماء System.Collections و System.Collections.Generic أنواعًا جاهزة للقوائم والقواميس والمكدسات والطوابير.

  • 🔃 التحجيم الديناميكي: تقوم المجموعات بإضافة وإزالة العناصر في وقت التشغيل، لذلك لا يمكنك تحديد الحجم مسبقًا كما هو الحال مع المصفوفة.
  • 📚 مساحات الأسماء: يحتوي System.Collections على الأنواع غير العامة، بينما يحتوي System.Collections.Generic على الأنواع العامة الآمنة من حيث النوع.
  • 🧱 المواد الأساسية: تغطي ArrayList و Stack و Queue و Hashtable و SortedList و BitArray الاحتياجات غير العامة الشائعة.
  • ✅ قوة عامة: تضيف القوائم والقواميس ومجموعات التجزئة وقوائم الانتظار أمانًا لأنواع البيانات في وقت الترجمة وأداءً أفضل.
  • 🔑 الخيار الصحيح: استخدم قاموسًا للبحث عن المفاتيح، وقائمة للعناصر المرتبة، ومكدسًا أو طابورًا لترتيب LIFO أو FIFO.
  • 🤖 مساعدة الذكاء الاصطناعي: يقوم GitHub Copilot بإنشاء أكواد تجميع البيانات، وتقوم خطوط أنابيب ML.NET بتمرير البيانات من خلال أنواع التجميع العامة.

المجموعات في لغة C#

في درسنا السابق، تعلمنا كيف يمكننا استخدام المصفوفات في لغة C#. دعونا نلقي نظرة سريعة عليها، المصفوفات في البرمجة تستخدم لتجميع مجموعة من الكائنات ذات الصلة. لذا يمكن للمرء إنشاء مصفوفة أو مجموعة من الأعداد الصحيحة، والتي يمكن الوصول إليها عبر اسم متغير واحد.

ما هي المجموعات في C#؟

مجموعات مماثلة ل المصفوفاتفهو يوفر طريقة أكثر مرونة للعمل مع مجموعة من الكائنات.

في المصفوفات، كنت قد لاحظت أنك بحاجة إلى تحديد عدد العناصر في المصفوفة مسبقًا. كان لا بد من القيام بذلك عندما تم الإعلان عن المصفوفة.

لكن في المجموعة، لا تحتاج إلى تحديد حجم المجموعة مسبقًا. يمكنك إضافة عناصر أو حتى إزالة عناصر من المجموعة في أي وقت. سيركز هذا الفصل على كيفية العمل مع المجموعات المختلفة المتوفرة في لغة C#.

فئات System.Collections

يُصنّف إطار عمل .NET فئات المجموعات الأصلية غير العامة ضمن مساحة اسم System.Collections. يلخص الجدول أدناه الأنواع الرئيسية التي يمكنك استخدامها مباشرةً.

التشكيلات الوصف
ArrayList مجموعة ArrayList تشبه المصفوفات نوع البيانات في C#. الاختلاف الأكبر هو الطبيعة الديناميكية لمجموعة قائمة المصفوفة.
كومة تُعتبر المكدسة حالة خاصة من مجموعات البيانات التي تمثل مفهوم "آخر ما يدخل أول ما يخرج" (LIFO).
طوابير تُعدّ قائمة الانتظار مجموعة خاصة تمثل مفهوم "الأول في الأول خارج".
جدول التجزئة جدول التجزئة هو مجموعة خاصة تُستخدم لتخزين عناصر المفتاح والقيمة.
قائمة مرتبة SortedList عبارة عن مجموعة تقوم بتخزين أزواج القيمة الرئيسية بترتيب تصاعدي للمفتاح افتراضيًا.
BitArray مصفوفة البت هي مصفوفة من بنية البيانات التي تخزن البتات.

المجموعات العامة في لغة C#

تُخزّن الفئات غير العامة المذكورة أعلاه كل عنصر ككائن عام، مما يعني أن المُصرّف لا يستطيع التحقق من النوع، ويتكبّد البرنامج تكلفة بسيطة لتغليف القيم. ولحل هذه المشكلة، أضافت لغة C# مساحة الاسم System.Collections.Generic، حيث ترتبط كل مجموعة بنوع مُعلن واحد.

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

فيما يلي قائمة بأكثر المجموعات العامة شيوعًا:

  • قائمة : قائمة قابلة لتغيير الحجم تعتمد على الفهرس، وهي البديل العام لـ ArrayList.
  • قاموس : يخزن أزواج المفاتيح والقيم مع عمليات بحث سريعة تعتمد على التجزئة.
  • مجموعة التجزئة : يحتوي فقط على قيم فريدة ويدعم عمليات المجموعات مثل الاتحاد.
  • طابور : مجموعة "الأولوية للأقدم"، وهي النسخة العامة من قائمة الانتظار.
  • كومة : مجموعة "آخر ما يدخل أول ما يخرج"، وهي النسخة العامة من Stack.
  • قائمة مرتبة : يحافظ على ترتيب أزواج المفاتيح والقيم حسب المفتاح بترتيب تصاعدي.

مثال على مجموعة قوائم بلغة C#

تُعدّ القائمة (List) أكثر أنواع المجموعات العامة استخدامًا لأنها تعمل كالمصفوفة الديناميكية. ينشئ المثال أدناه قائمة من السلاسل النصية، ويضيف إليها عناصر ويحذف أخرى، ويقرأ حجمها، ثم يطبع القيم المتبقية. كُتب الكود بالكامل في ملف Program.cs.

الخطوة 1) قم باستيراد مساحة الاسم System.Collections.Generic وقم بتعريف قائمة من السلاسل النصية.

الخطوة 2) أضف العناصر باستخدام طريقة الإضافة واحذف عنصرًا واحدًا باستخدام طريقة الحذف.

الخطوة 3) اقرأ خاصية العد، ثم قم بالمرور عبر القائمة باستخدام عبارة foreach.

using System;
using System.Collections.Generic;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   List<string> tutorials = new List<string>();
   tutorials.Add("Java");
   tutorials.Add("Python");
   tutorials.Add("Kotlin");
   tutorials.Remove("Python");
   Console.WriteLine(tutorials.Count);
   foreach (string tutorial in tutorials)
   {
    Console.WriteLine(tutorial);
   }
   Console.ReadKey();
  }
 }
}

Code تفسير:-

  1. يتم استيراد مساحة الاسم System.Collections.Generic بحيث يكون نوع القائمة متاحًا للبرنامج.
  2. قائمة جديدة يتم إنشاء مجموعة تسمى "الدروس التعليمية"، ويتم إضافة ثلاثة أسماء باستخدام طريقة الإضافة.
  3. تقوم دالة Remove بحذف القيمة "Python"وهذا يترك عنصرين في القائمة".
  4. تقوم خاصية Count بإرجاع عدد العناصر، وتقوم حلقة foreach بطباعة كل قيمة متبقية بالترتيب.

عند تشغيل البرنامج، يقوم أولاً بطباعة عدد 2، تليها Java و كوتلن على أسطر منفصلة. يوضح هذا كيف يتغير حجم المجموعة أثناء التشغيل، وهو أمر لا يمكن للمصفوفة الثابتة القيام به.

الفرق بين المصفوفات والمجموعات في لغة C#

كلاهما مجموعة وتجميع العناصر ذات الصلة تحت اسم واحد، إلا أن سلوكها يختلف عند تشغيل البرنامج. معرفة متى تستخدم كلًا منهما يساعدك على كتابة كود أكثر وضوحًا وكفاءة.

فيما يلي أبرز الاختلافات:

  • المقاس : المصفوفة لها طول ثابت يتم تحديده عند الإعلان عنها، بينما يمكن للمجموعة أن تنمو أو تتقلص في أي وقت.
  • معالجة الأنواع: تخزن المصفوفة نوعًا واحدًا، بينما يمكن أن تكون المجموعة آمنة من حيث النوع مع الأنواع العامة أو تحتوي على كائنات من أنواع مختلطة عندما تكون غير عامة.
  • المكان تم تضمين المصفوفات في اللغة، بينما توجد فئات المجموعات في مساحات الأسماء System.Collections و System.Collections.Generic.
  • العمليات المدمجة: توفر المجموعات طرقًا جاهزة لإضافة العناصر وإزالتها والبحث عنها وفرزها، بينما توفر المصفوفات وصولًا أساسيًا مفهرسًا فقط.
  • أفضل استخدام: اختر مصفوفة عندما يكون عدد العناصر معروفًا وثابتًا، ومجموعة عندما يتغير العدد أثناء تشغيل البرنامج.

باختصار، تعتبر المصفوفات هي الأفضل للبيانات ذات الحجم الثابت، بينما توفر المجموعات المرونة التي تحتاجها معظم التطبيقات الواقعية.

الأسئلة الشائعة

استخدم القاموس عندما تحتاج إلى عمليات بحث سريعة باستخدام مفتاح فريد، مثل معرّف مرتبط بسجل. فهو يجد القيم في وقت شبه ثابت، بينما يجب على القائمة فحص العناصر واحدًا تلو الآخر.

تُوفّر كلٌّ من HashSet و Dictionary أسرع عمليات البحث لأنها تستخدم التجزئة للوصول إلى عنصرٍ ما في وقتٍ شبه ثابت. أما List أو المصفوفة فهما أبطأ لأنهما قد تحتاجان إلى فحص كل عنصرٍ على حدة.

توجد المجموعات المتزامنة في مساحة الاسم System.Collections.Concurrent وهي مصممة للعمل مع التعليمات البرمجية متعددة الخيوط. تتيح أنواع مثل ConcurrentDictionary و BlockingCollection لعدة خيوط إضافة العناصر وإزالتها بأمان دون الحاجة إلى عمليات تأمين يدوية.

تُعدّ IEnumerable الواجهة الأساسية التي تدعم فقط قراءة العناصر باستخدام حلقة foreach. أما ICollection فهي امتداد لها وتضيف أعضاءً مثل Count و Add و Remove، لذا فهي تدعم أيضًا تعديل المجموعة.

القائمة هي مجموعة عامة وآمنة من حيث النوع، تخزن نوعًا واحدًا مُعلنًا، مما يوفر فحوصات وقت الترجمة وأداءً أفضل. أما ArrayList فهي غير عامة، وتخزن كل عنصر ككائن، مما يتطلب تحويلًا للأنواع ويسمح بأنواع مختلطة.

يعمل نظام المكدس وفق ترتيب "آخر ما يدخل أول ما يخرج"، لذا تتم إزالة أحدث عنصر أولاً باستخدام عملية "السحب". أما نظام الطابور فيعمل وفق ترتيب "أول ما يدخل أول ما يخرج"، لذا تتم إزالة أقدم عنصر أولاً باستخدام عملية "الإزالة".

نعم. يمكن لـ GitHub Copilot اقتراح نوع المجموعة المناسب، وإنشاء حلقات تضيف أو ترشح العناصر، وإكمال استعلامات LINQ من تعليق قصير، مما يسرع العمل مع القوائم والقواميس والمجموعات الأخرى.

يُغذي ML.NET بيانات التدريب من خلال مجموعات مثل List و IEnumerable، والتي تُطابق مسار IDataView الخاص به. ويُحافظ تخزين العينات في مجموعة عامة ذات أنواع بيانات محددة بدقة على وضوح سير عمل التعلم الآلي وأمانه من ناحية أنواع البيانات.

تلخيص هذه التدوينة بـ: