کلاس ArrayList

کلاس ArrayList به شما اجازه ذخيره مقادير انواع داده‌ای مختلف، و توانايي حذف و اضافه عناصر آرايه در هر لحظه را می‌دهد. در مثال زير به سادگي کاربرد کلاس ArrayList آمده است.

using System;
using System.Collections;

public class Program
{
    public static void Main()
    {
        ArrayList myArray = new ArrayList();

        myArray.Add("John");
        myArray.Add(5);
        myArray.Add(true);
        myArray.Add(3.65);
        myArray.Add('R');

        foreach (object element in myArray)
        {
            Console.WriteLine(element.ToString());
        }
    }
}
John
5
true
3.65
R

براي استفاده از اين کلاس ابتدا بايد در قسمت فضاهاي نامي، فضاي نام System.Collections را وارد کنيم (خط 2). همانطور که در مثال مشاهده می‌کنید يک نمونه از کلاس ArrayList ايجاد می‌کنیم. براي اضافه کردن يک عنصر به آرايه بايد از متد ()Add استفاده کنيم. از آنجاييکه شي ايجاد شده از کلاس ArrayList آرگوماني از نوع object قبول می‌کند بنابراين می‌توان مقاديري از هر نوع داده‌ای به آن ارسال کرد چون هر چيز در سي شارپ از object ارث بري می‌کند.

حال براي نمايش توانايي اين کلاس در نگهداري انواع داده‌ای مختلف پنج مقدار از پنج نوع مختلف داده را به آن اضافه می‌کنیم. سپس همه مقادير را با استفاده از دستور foreach می‌خوانیم. چون کلاس ArrayList داراي انواع داده‌ای مختلفي است نمی‌توانیم از يک نوع داده‌ای خاص براي خواندن مقادير استفاده کنيم. لذا براي اين کار بايد از نوع object که می‌تواند هر نوع داده‌ای در خود ذخيره کند استفاده نمود. در داخل حلقه از متد ()ToString براي نشان دادن مقادير استفاده کرده‌ایم. به اين نکته توجه کنيد که براي دسترسي به هر عنصر می‌توانید از طريق انديس آن قدام نماييد. کد زير نحوه استفاده از حلقه for براي دسترسي به هر يک از اعضا را نشان می‌دهد.

for (int i = 0; i < myArray.Count; i++)
{
    Console.WriteLine(myArray[i].ToString());
}

به خاصيت Count در کد بالا توجه کنيد. اين خاصيت درست شبيه به خاصيت Length آرايه معمولي است و کار آن شمارش تعداد عناصرشی ArrayList می‌باشد.. در کد بالا همانطور که نشان داده شده است می‌توان به هر يک از عناصر با استفاده از اندیسشان دست يافت. نکته ديگر اين است که شما می‌توانید به کلاس ArrayList يک ظرفيت ابتدايي بدهيد. به عنوان مثال شما می‌توانید با استفاده از يک سازنده سربارگذاري شده نشان دهيد که یک شیء ArrayList می‌تواند داراي 5 عنصر باشد.

ArrayList myArray = new ArrayList(5);

کد بالا 5 مکان خالي به وجود می‌آورد و شما می‌توانید با استفاده از متد ()Add يکي ديگر به آنها اضافه کنيد. اگر همه مکانها به وسيله مقادير پر شوند می‌توان سایزشی ايجاد شده از کلاس ArrayList را با استفاده از تغيير خاصيت Capacity آن تغيير داد. يکي ديگر از نسخه‌های سازنده کلاس ArrayList شيئي که رابط Icollection را اجرا می‌کند را قبول می‌کند. System.Array مثالي از این شیء است. بنابراين شما يک آرايه را به سازنده ارسال می‌کنید و مقادير آن آرايه در شیء ArrayList کپي می‌شوند.

object[] array = {"John", 5, true, 3.65, 'R' };

ArrayList myArray = new ArrayList(array);

می‌توان با استفاده از متد ()Remove کلاس ArrayList عناصر را پاک کرد. متد ()Remove یک شیء که مطابق مقدار يک عنصر در آرايه است را قبول می‌کند. اين متد به محض رسيدن به مقدار مورد نظر آن را حذف می‌کند. اگر عنصري را که مکاني غير از مکان آخر آرايه باشد حذف کنيد بقيه عناصر بعد از آن عنصر مکان خود را تنظيم می‌کنند به اين معني که فرض کنيد آرایه‌ای داراي 5 عنصر است و شما عنصر 3 را حذف می‌کنید، در اين صورت جاي خالي اين عنصر توسط عنصر 4 و جاي عنصر 4 توسط عنصر 5 پر می‌شود. به تکه کد زير توجه کنيد :

using System;
using System.Collections;

public class Program
{
    public static void Main()
    {
        ArrayList myArray = new ArrayList();

        myArray.Add("John");
        myArray.Add(5);
        myArray.Add(true);
        myArray.Add(3.65);
        myArray.Add('R');

        for (int i = 0; i < myArray.Count; i++)
        {
            Console.WriteLine("myArray[{0}] = {1}", i, myArray[i]);
        }

        //Remove element number 1
        myArray.Remove(5);

        Console.WriteLine("nAfter removing myArray[1] (The value 5)...n");

        for (int i = 0; i < myArray.Count; i++)
        {
            Console.WriteLine("myArray[{0}] = {1}", i, myArray[i]);
        }
    }
}
myArray[0] = John
myArray[1] = 5
myArray[2] = True
myArray[3] = 3.65
myArray[4] = R

After removing myArray[1] (The value 5)...

myArray[0] = John
myArray[1] = True
myArray[2] = 3.65
myArray[3] = R

از آنجاييکه در مثال بالا مقدار عنصر myArray[1] را حذف کرده‌ایم همه عناصر متوالي در آرايه بالا مکان خود را تغيير می‌دهند. بنابراين عنصر myArray[2] جاي myArray[1]، عنصر myArray[3] جاي myArray[2] و …را می‌گیرد. شما همچنين می‌توانید با استفاده از متد ()RemoveAt به انديس آرايه خاصي دست يافته و آن را حذف نماييد. اين متد يک پارامتر قبول می‌کند و آن انديس عنصري است که می‌خواهید از آرايه حذف کنيد.

حذف و اضافه کردن چند آيتم

می‌توان با استفاده از متدهاي ()AddRange و ()RemoveRange چندين آيتم را از آرايه حذف يا به آن اضافه نمود. متد ()AddRange می‌تواند آرایه‌ای از چند مقدار را گرقته و آنها را به شي ArrayList اضافه کند.

ArrayList myArray = new ArrayList();

myArray.Add(1);
myArray.Add(2);

int[] numbers = { 3, 4, 5 };

myArray.AddRange(numbers);

foreach(object element in myArray)
{
    Console.WriteLine(element);
}
1
2
3
4
5

متد ()RemoveRange کاملاً با متد ()AddRange متفاوت است. اين متد دو پارامتر قبول می‌کند، انديس عنصري که فرايند حذف از آن شروع می‌شود و تعداد عناصري که می‌خواهیم حذف کنيم. به عنوان مثال اگر بخواهيد عناصر 2 تا 6 را حذف کنيد بايد تکه کد زير را بنويسيد :

myArray.RemoveRange(2, 5);

جستجوي مقادير

با استفاده از متد ()Contains می‌توان چک کرد که آيا يک مقدار خاص در داخل آرايه وجود دارد يا خير. اين متد يک آرگومان از نوع شیء را قبول کرده و اگر يک مقدار را در داخل ليست عناصر پيدا کند true را بر می‌گرداند، از متدهاي ()IndexOf و ()LastIndexOf براي تشخيص انديس يک مقدار خاص استفاده می‌شود.

متد ()IndexOf انديس اولين محل وقوع يک مقدار خاص را بر می‌گرداند.

متد ()LastIndexOf انديس آخرين محل وقوع يک مقدار خاص را بر می‌گرداند.

هر دو متد، در صورتيکه مقدار مورد نظر را پيدا نکنند مقدار 1- را بر می‌گردانند.

متد ()BinarySearch هم می‌توان براي جستجوي يک مقدار استفاده نمود. البته اين متد براي جستجو يک عنصر در داخل تعداد زيادي از عناصر مناسب است.

مرتب سازي مقادير ArrayList

با استفاده از متد Sort می‌توان مقادير يک آرايه را مرتب نمود. اعداد از بزرگ به کوچک و رشته بر اساس حروف الفبا مرتب می‌شوند. اگر از اين متد استفاده کنيد همه اجزا با هم مقايسه می‌شوند. به عنوان مثال نمی‌توان يک رشته و يک عدد از نوع int را در داخل ArrayList قرار داد و آنها را با متد ()Sort مرتب نمود. در درس آينده ياد خواهيد گرفت که چگونه از يک مقايسه گر سفارشي براي مرتب کردن عناصر استفاده نمود.