آرایه دندانه دار

آرایه دندانه دار یا jagged array آرایه‌ای چند بعدی است که دارای سطرهای با طول متغیر می‌باشد. نمونه ساده‌ای از آرایه‌های چند بعدی، آرایه‌های مستطیلی است که تعداد ستون‌های سطرهای آنها برابر است. اما آرایه‌های دندانه دار دارای سطرهایی با طول متفاوت می‌باشند. بنابر این آرایه‌های دندانه دار را می‌توان آرایه‌ای از آرایه‌ها فرض کرد. دستور نوشتن این نوع آرایه‌ها به صورت زیر است :

datatype[][] arrayName;

ابتدا datatype که نوع آرایه است و سپس چهار کروشه باز و بسته و بعد از آن نام آرایه را می‌نویسیم. مقداردهی به این آرایه‌ها کمی گیج کننده است. به مثال زیر توجه کنید :

int[][] myArrays = new int[3][];

myArrays[0] = new int[3];
myArrays[1] = new int[5];
myArrays[2] = new int[2];

jagged-array-1001
ابتدا با استفاده از کلمه کلیدی new سطرهای آرایه را مشخص می‌کنیم. بعد از کلمه کلیدی new نوع آرایه و سپس در اولین کروشه باز و بسته تعداد سطرها را می‌نویسیم. سپس تعداد ستون‌های هر سطر را با استفاده از اندیس هر سطر به صورت بالا مشخص می‌کنیم. سپس بعد از تعریف ستون‌ها به صورت زیر می‌توان با استفاده از آکولاد مقادیر هر سطر را مشخص کرد :

int[][] myArrays = new int[3][];

myArrays[0] = new int[3] { 1, 2, 3 };
myArrays[1] = new int[5] { 5, 4, 3, 2, 1 };
myArrays[2] = new int[2] { 11, 22 };

یک روش بهتر برای مقدار دهی آرایه‌های دندانه دار به صورت زیر است :

int[][] myArrays = new int[3][] { new int[3] { 1, 2, 3 },
                                  new int[5] { 5, 4, 3, 2, 1 },
                                  new int[2] { 11, 22 } };

می‌توان طول سطرها را هم مشخص نکرد :

int[][] myArrays = new int[][] { new int[] { 1, 2, 3 },
                                 new int[] { 5, 4, 3, 2, 1 },
                                 new int[] { 11, 22 } };

کد بالا را به صورت سادهتر زیر هم می‌توان نوشت :

int[][] myArrays = { new int[] { 1, 2, 3 },
                     new int[] { 5, 4, 3, 2, 1 },
                     new int[] { 11, 22 } };

برای دسترسی به مقدار عناصر یک آرایه دندانه دار باید اندیس سطر و ستون آن را در اختیار داشته باشیم :

array[row][column]
Console.WriteLine(myArrays[1][2]);

نمی‌توان از حلقه foreach برای دسترسی به عناصر آرایه دندانه دار استفاده کرد :

foreach(int array in myArrays)
{
    Console.WriteLine(array);
}

اگر از حلقه foreach استفاده کنیم با خطا مواجه می‌شویم چون عناصر این نوع آرایه‌ها، آرایه هستند نه عدد یا رشته یا… . برای حل این مشکل باید نوع متغیر موقتی (array) را تغییر داده و از حلقه foreach دیگری برای دسترسی به مقادیر استفاده کرد.

foreach(int[] array in myArrays)
{
   foreach(int number in array)
   {
      Console.WriteLine(number);
   }
}

همچنین می‌توان از یک حلقه for تو در تو به صورت زیر استفاده کرد :

for (int row = 0; row < myArrays.Length; row++)
{
   for (int col = 0; col < myArrays[row].Length; col++)
   {
      Console.WriteLine(myArrays[row][col]);
   }
}

در اولین حلقه از خاصیت Length برای به دست آوردن تعداد سطرها (که همان آرایه‌های یک بعدی هستند) و در دومین حلقه از خاصیت Length برای به دست آوردن عناصر سطر جاری استفاده می‌شود.