مجموعه‌ها (Collections)

يک مجموعه, شامل تعدادي از اشياء هم نوع است که
با هم, گروهي را تشکيل مي‌دهند. انواع مختلفي از اشياء مي‌توانند در کنار
يکديگر, مجموعه واحدي از نوع Object را تشکيل دهند و از ساختارهاي موجود در زبان مورد نظر, بهره‌مند شوند.

به عنوان مثال, دستور foreach در C#‎ (for each در Visual Basic), تمامي اشياء موجود در مجموعه را از يک نوع واحد در نظر مي‌گيرد.

با اين وجود, در يک مجموعه از نوع Object, اعمال ديگري نيز بر روي تک تک عناصر اعمال مي‌شوند (از قبيل boxing, unboxing يا تبديلات) که بر روي کارآيي مجموعه تأثير گذارند. Boxing و unboxing معمولاً زماني انجام مي‌گيرند که بخواهيد مقداري را در يک مجموعه از نوع object ذخيره کرده, يا از آن بازيابي کنيد.

مجموعه‌هاي generic از قبيل list و نيز مجموعه‌هاي غير generic از قبيل String Collection,
در صورت همنوع بودن عناصر با مجموعه, از تغيير در کارايي آن, جلوگيري
مي‌نمايند (مثلاً به هنگام ذخيره‌سازي يا بازيابي رشته‌ها از يک String Collection).
علاوه بر اين, مجموعه‌هايي که نوع آنها کاملاً مشخص شده است, نوع هر
عنصري را که به مجموعه افزوده مي‌شود, بررسي مي‌کنند تا حتماً از نوع
مجموعه باشد.

تمامي مجموعه‌هايي که به طور مستقيم يا غير مستقيم, رابط Icollection (generic يا غير generic)
را پياده‌سازي مي‌کنند, ويژگي‌هاي ديگري را نيز علاوه بر متدهايي که عمل
افزودن, حذف کردن و يا جستجو کردن را در عناصر مجموعه اعمال مي‌کنند, به
اشتراک مي‌گذارند:
· يک enumerator


شيئي است که در مجموعه مرتبط با خود, به طور
تکراري پيش مي‌رود و مي‌توان از آن به عنوان اشاره‌گر متحرکي به هر يک از
عناصر مجموعه, ياد کرد. يک enumerator, تنها مي‌تواند با يک مجموعه در ارتباط باشد اما يک مجموعه قادر است چندين enumerator داشته باشد. دستور foreach در C#‎, از enumerator استفاده کرده, پيچيدگي کار با enumerator را پنهان مي‌نمايد.
· متد CopyTo


تمامي متدها مي‌توانند با استفاده از CopyTo, در يک آرايه کپي شوند, با اين وجود, ترتيب عناصر آرايه جديد, بر اساس ترتيبي است که enumerator, آنها را بازمي‌گرداند. آرايه حاصل, همواره يک بعدي است و حد پايين آن, صفر است. به خاطر داشته باشيد که رابط Icollection (نوع generic), داراي اعضاي ديگري نيز مي‌باشد که رابط غير generic, فاقد آنهاست.

ويژگي‌هاي زير, در برخي از کلاسهاي موجود در namespaceهاي System.Collection پياده‌سازي مي‌شوند:
· Capacity و Count


Capacity يک مجموعه عبارتست از تعداد عناصري که مي‌تواند در آن مجموعه موجود باشد. Count يک مجموعه شامل تعداد عناصري است که در حال حاضر در آن وجود دارد. استثنايي در اين زمينه وجود دارد که عبارتست از .Bit Array در اين مجموعه, Capacity همان طول مجموعه است که با Count برابر مي‌باشد. در برخي مجموعه‌ها, Capacity يا Count و يا هر دوي آنها پنهان مي‌ماند. تمامي مجموعه‌هاي موجود در namespaceهاي System.Collections, بطور خودکار به هنگام دستيابي به Capacity
جاري گسترش مي‌يابند. حافظ مورد نظر اختصاص يافته, عناصر از مجموعه قبلي
در مجموعه جديد کپي مي‌شوند. اين عمل باعث کاهش کد مورد نياز جهت استفاده
از مجموعه مي‌گردد. با اين وجود ممکن است کارايي مجموعه همچنان بطور منفي
تحت تأثير واقع شوند. بهترين روش براي جلوگيري از کاهش کارايي که توسط
تخصيص‌دهي‌هاي مجدد چندگانه ايجاد شده است, آن است که Capacity آغازي را بر اساس اندازه تخمين زده شده مجموعه تنظيم کنيد.
· حد پايين (Lower bound)


حد پايين يک مجموعه, همان انديس اولين عنصر آن است. تمامي مجموعه‌هاي انديس گذاري شده در namespaceهاي System.Collections داراي يک حد پايين صفر مي‌باشند. آرايه, بطور پيش فرض داراي يک حد پايين برابر با صفر است. اما به هنگام ايجاد يک نمونه از کلاس Array با استفاده از Create Instance مي‌توان يک حد پايين متفاوتي را تعريف کرد. کلاسهاي System.Collection را مي‌توان بطور معمول به سه نوع تقسيم کرد:
· مجموعه‌هاي رايج


انواع مختلفي از مجموعه‌هاي داده‌اي رايج وجود دارند که عبارتند از جداول درهم (hash table), صف‌ها, پشته‌ها, ديکشنري‌ها و ليست‌ها. اين نوع مجموعه‌ها داراي نسخه‌هاي generic و غير generic مي‌باشند.
· مجموعه‌هاي بيتي (Beat Collections)


عناصر اين نوع مجموعه, flagهاي بيتي هستند. اين مجموعه‌ها کمي متفاوت از ساير مجموعه‌ها عمل مي‌کنند.
· مجموعه‌هاي خاص


اين نوع مجموعه‌ها داراي اهداف خاصي هستند که معمولاً براي کنترل نوع خاصي از عنصر از قبيل String Dictionary مورد استفاده قرار مي‌گيرند.

همواره دقت کنيد که مجموعه مناسبي را انتخاب
نماييد زيرا هر مجموعه داراي عملکردهاي منحصر به فردي است که هر يک از
آنها داراي محدوديت‌هاي ويژه‌اي مي‌باشند. هر چه يک مجموعه, خاص‌تر باشد,
محدوديت آن بيشتر است.





Array List

اين مجموعه, با استفاده از آرايه‌اي که اندازه آن در صورت نياز, به طور ديناميکي افزايش مي‌يابد, رابط Ilist را پياده‌سازي مي‌کند.

Namespace: System.Collections

Assembly: mscorlib (mscorlib.dll در )

اين مجموعه, به صورت زير, تعريف مي‌شود:

public class ArrayList: IList, ICollection, IEnumerable, ICloneable

ArrayList, لزوماً مرتب شده نيست و حتماً بايد پيش از اجراي عملياتي از قبيل BinaySearch, که نياز به يک ArrayList مرتب شده دارند, آن را مرتب نمود. Capacity يک ArrayList, تعداد عناصري است که مي‌توانند در ArrayList, گنجانده شوند. Capacity آغازين يک ArrayList, به طور پيش فرض, 0 مي‌باشد. با افزوده شدن عناصر به يک ArrayList, Capacity آن نيز افزايش مي‌يابد. capacity را مي‌توان با فراخواني TrimToSize و يا با تنظيم آشکار مشخصه Capacity, کاهش داد.

عناصر موجود در اين نوع مجموعه, با استفاده از يک انديس صحيح, قابل دسترسي مي‌باشند. انديسهاي موجود در اين مجموعه, zero-based هستند. يعني انديس آغازين, صفر مي‌باشد (به طور پيش فرض).

ArrayList, يک مرجع null (Nothing در VisualBasic) را به عنوان يک مقدار مجاز مي‌پذيرد و وجود عناصر تکراري را در مجموعه, امکان‌پذير مي‌سازد.

مثال:

در کد زير, نحوه ايجاد و مقداردهي اوليه يک ArrayList و نيز چگونگي چاپ کردن مقادير آن, نشان داده شده است:

کد:

کد:
using System;

using System.Collections;

public class SamplesArrayList {



public static void Main() {



//Creates and initializes a new ArrayList.

ArrayList myAL = new ArrayList();

myAL.Add(“Hello”);

myAL.Add(“World”);

myAL.Add(“!”);



//Displays the properties and values of the ArrayList.

Console.WriteLine(“myAL”);

Console.WriteLine(“ Count: {0}”, myAL.Count);



Console.WriteLine(“ Capacity: {0}”, myAL.Capacity);

Console.WriteLine(“ Values:”);

PrintValues(myAL);

}



public staic void PrintValues(Ienumerable myList) {

foreach (Object obj in myList)

Console.WriteLine(“ {0}”, obj);

Console.WriteLine();

}

}</pre>


کد فوق, خروجي زير را توليد مي‌کند:

myAL

Count: 3

Capacity: 16

Values: Hello World !