Professional Documents
Culture Documents
تسمح الكائنات من هذه المجموعة بإضافة أي نوع من العناصر لها ،حيث من الممكن أن نضيف عناصر
من النوع object.يمكن إضافة العناصر إلى هذه المجموعة باستخدام التابع Addالذي يقبل وسي ً
طا
من النوع object.أي أنّنا فعليًّا نستطيع أن نضيف عناصر من أنواع مختلفة لنفس المجموعة .أ ّ
ي
عنصر تت ّم إضافته سيوضع آخر المجموعة التي هي ذات حجم مرن ،فمن الممكن إضافة أي عدد نرغبه
من العناصر .أ ّما إذا أردنا إضافة عنصر إلى مكان محدّد ضمن القائمة ،فعلينا استخدام
األول هو الدليل المراد إدراج العنصر الجديد ضمنه ،والثاني
التابع Insertالذي يحتاج إلى وسيطينّ ،
هو العنصر نفسه.
;using System.Collections
namespace oop_8
{
class Program
{
)static void Main(string[] args
{
;)(ArrayList values = new ArrayList
;)" values.Add("My
;)" values.Add("age:
;)values.Add(36
)foreach (object item in values
{
استطعنا الحصول على عناصر هذه المجموعة باستخدام حلقة foreach.ولكن إذا أردنا الوصول إلى
عنصر محدّد فحسب ،ولنقل أنّه العنصر الثالث (القيمة )36في مثالنا السابق ،فيمكن ذلك من خالل الشكل
التالي:
]values[2
األول هو .0في الواقع ستكون القيمة التي سنحصل عليها من ] values[2هي تذ ّكر دو ًما ّ
أن دليل العنصر ّ
قيمة من نوع objectرغم أنّها في حقيقة األمر تحوي القيمة 36وهي قيمة من نوع intبطبيعة
ي وهو أ ّننا عندما أضفنا القيمة 36إلى المجموعة كان ذلك باستخدام التابع
الحال .السبب في ذلك منطق ّ
ّ
المخزنة طا من النوع object.إذا أردنا االستفادة من القيمة الفعليّة Addالذي يقبل وسي ً
ضمن ] values[2فعلينا هنا أن نستخدم عامل التحويل ) (intعلى الشكل التالي:
مالحظة :عند تمرير القيمة 36في المثال السابق إلى التابع Addالذي يتوقّع وسيط من نوع
objectتحدث ظاهرة نسميها التعليب boxing.حيث تُعلَّب القيمة 36ليصبح باإلمكان تمريرها مكان
وسيط يتطلّب النوع objectأ ّما عندما نريد استرجاع القيمة الفعليّة فإنّنا نقوم بعمليّة معاكسة تدعى بإلغاء
التعليب unboxingباستخدام عامل التحويل بين األنواع كما فعلنا بالعبارة البرمجيّة األخيرة:
المجموعات العمومية
تشبه المجموعات العموميّة generic collectionsمن حيث المبدأ المجموعات العاديّة باستثناء أنّها أكثر
أم ًنا وأفضل أدا ًء .حيث ينبغي تعيين نوع العناصر التي ستتعامل معها المجموعة عند التصريح عنها ،فتتعامل
المجموعة في هذه الحالة مع نوع ُمحدّد .من أشهر المجموعات العموميّة هي المجموعة >List<Tوهي
تعبّر عن القائمة list.قد يبدو الشكل السابق غريبًا ً
قليال ،ولك ّنه في الحقيقة بسيط .استبدل الحرف T
ي نوع (صنف) ترغبه وستقبل المجموعة نتيجة لذلك أن يكون عناصرها من هذا النوع .تقع المجموعات
بأ ّ
العموميّة في نطاق االسم System.Collections.Generic.
سنعدّل البرنامج OOP_2من الدرس السابق الذي كان يسمح بإدخال أسماء ودرجات خمسة طالب فقط،
ويخزنها على شكل كائنات Studentضمن مصفوفة من النوع []Studentوذلك إليجاد مجموع ّ
الدرجات والمعدّل .سنجعل هذا البرنامج يستخدم المجموعة العمومية > ( List<studentمجموعة يمكن
لعناصرها تخزين مراجع لكائنات من النوع )studentسننشئ البرنامج التالي لهذا الغرض :
;using System.Collections.Generic
namespace oop_9
{
class Student
{
} ;public string Name { get; set
} ;public int Mark { get; set
}
class Program
{
)static void Main(string[] args
{
;)(>List<Student> listStudents = new List<Student
;int sum = 0
;bool continueCondition = true
;int counter = 0
;string response
;)"Console.WriteLine("Input Students Marks
;)"====================="(Console.WriteLine
//input loop.
)while (continueCondition
{
4 بسمة سراقبي.م
جامعة ادلب
كلية الهندسة المعلوماتية
السنة الثانية -مادة برمجة متقدمة 1
لقد أجرينا هنا بعض التحسينات .بدأنا البرنامج بالتصريح عن المتغيّر listStudentsمن
النوع >List<Studentوإنشاء كائن من هذا النوع وإسناده لهذا المتغيّر .تقبل المجموعة
العموميّة > List<Studentبتخزين كائنات من النوع Studentضمنها .الحظ أنّنا لم نحدّد عدد
بدال من حلقة for الكائنات مسبقًا (مع أنّه يمكن ذلك بهدف تحسين األداء ال غير) .وضعنا حلقة ً while
ّ
الطالب الذين يرغب المستخدم بإدخال بياناتهم .الحظ القديمة وذلك ألنّنا ال نعرف على وجه التحديد عدد
ي.
شرط استمرار الحلقة continueConditionالذي يحمل القيمة trueبشكل افتراض ّ
أصبح البرنامج غير مقيّ ٍّد بعدد محدّد من الطالب ،فبعد إدخال بيانات كل طالب ،سيعرض البرنامج رسالة
يخيّر فيها المستخدم في إضافة المزيد أم التوقّف فإذا اختار المستخدم التوقّف بإدخاله النص " "Nأو ""n
عندها سيسند البرنامج القيمة falseللمتغيّر continueConditionمما يؤدّي إلى الخروج
صرحنا عنه في
ّ من حلقة whileعند بدء الدورة التالية .تنحصر وظيفة المتغيّر counterالذي
إظهار ترتيب الطالب الحالي على الشاشة.
ّ
المخزنة ضمنها نستخدم الخاصيّة Countللمجموعة listStudentsلمعرفة عدد العناصر الفعليّة
(تذ ّكر الخاصيّة Lengthالمماثلة لها في المصفوفات).
نمرر لهذا
يوجد تابع اسمه RemoveAtضمن هذه المجموعة يسمح بإزالة عنصر من القائمة ،حيث ّ
األول هو )0ليعمل هذا التابع على إزالته وإعادة التابع دليل indexالعنصر المراد إزالته (دليل العنصر ّ
تعيين أدلّة جميع العناصر بعد إزالة العنصر المطلوب .انظر الشيفرة التالية:
;)"listStrings.Add("Bird
;)"listStrings.Add("Fish
;)"listStrings.Add("Frog
;)listStrings.RemoveAt(1
ضا التابع Reverseالذي يعمل على عكس ترتيب العناصر الموجودة في المجموعة ،حيث
يوجد أي ً
األول .كما يوجد التابع Sortالذي يعمل على
األول هو األخير ،والعنصر األخير هو ّ
يصبح العنصر ّ
ي
ترتيب العناصر ضمن المجموعة وفق الترتيب االفتراضي (بالنسبة لألنواع المض ّمنة) أو وفق ترتيب كيف ّ
يمكن للمبرمج أن يختاره.
وهناك تابع مفيد آخر وهو BinarySearchالذي يجري خوارزمية البحث الشهيرة على عناصر
نمرر إليه القيمة المراد البحث عنها (أو مرجع الكائن الذي نريد البحث عنه) ويُرجع هذا
المجموعة ،حيث ّ
أن هذا الدليل يمثّل دليل العنصر ضمن
التابع دليل العنصر ضمن المجموعة في حال وجده .مع االنتباه إلى ّ
ي قبل أن يجري عملية البحث .إذا أردت المجموعة على اعتبارها مرتّبة .إذ أنّه يقوم بترتيبها بشكل داخل ّ
الحصول على نتائج منطقيّة ،فاعمل على ترتيب مجموعتك باستخدام التابع Sortقبل
استدعاء BinarySearch.
يمكننا الوصول إلى عنصر محدّد ضمن مجموعة عموميّة بنفس األسلوب التي تحدّثنا عنه في المجموعات
العاديّة ،مع مالحظة أ ّننا لن نحتاج إلى عامل التحويل بين األنواع ،وبالتالي التخ ّلص من عمليت ّ
ي التعليب
ضا من التابع Insertلإلدراج ضمن موقع
boxingوإلغاء التعليب unboxing.كما يمكن االستفادة أي ً
ضا في المجموعات العاديّة.
ُمحدّد ،والذي تحدّثنا عنه أي ً
توجد توابع أخرى مفيدة ضمن المجموعة <List<Tولكنّنا لن نستطيع الخوض فيها قبل أن نتحدّث عن
النواب delegatesفي درس الحق.
ّ
مالحظة :توجد طريقة سريعة وفعّالة إلنشاء مجموعة >List<Tوإسناد عناصر إليها مباشرة ً في حال
كان عدد العناصر محدّد ومعروف سل ًفا .فإذا أردنا إنشاء مجموعة من النوع >List<intتحوي
العناصر 10 ،5 ،2 ،1يمكنك كتابة العبارة التالية لهذا الغرض:
تمارين داعمة
تمرين 1
ويخزنها ضمن مجموعة من ّ اكتب برنام ًجا يطلب من المستخدم إدخال خمس قيم نصيّة،
النوع <List<string.ث ّم استخدم التابع Reverseلعكس ترتيب العناصر ضمن هذه المجموعة،
ث ّم اطبع النتائج على الشاشة.
تمرين 2
اكتب برنام ًجا يطلب من المستخدم إدخال قيم عدديّة من النوع doubleبقدر ما يريد ،وبعد أن يفرغ من
اإلدخال ،احسب المتوسّط الحسابي (المعدّل) لهذه األعداد ،ورتّبها باستخدام التابع ،Sortثم اطبعها على
الشاشة ،مع المتوسّط الحسابي لها.
الخالصة
ي
تعرفنا في هذا الدرس على الواجهات Interfacesوالمجموعات Collections.من النادر أن يخلو أ ّ ّ
ي من استخدام المجموعات أو الواجهات ،وفي الحقيقة هناك العديد من بنى المجموعات المفيدة
برنامج فعل ّ
والرائعة للمجموعات في سلسلة قادمة.
التي لم نتناولها في هذا الدرس .سنحاول أن نتوسّع في المزايا القويّة ّ