آموزش ایجاد آرایه در آرایه در سی شارپ
همان طور که بخش آخر بحث شد، گفته می شود که آرایه های چندبعدی، مستطیلی هستند؛ زیرا هر ردیف(row) در آنها سایز یکسانی دارد. از آخرین مثال استفاده می شود که ما می توانیم برای هر مختصات x امکان پذیر، یک مختصات y از 0 تا 3 داشته باشیم.
این نیز امکان پذیر است که از آرایه های دندانه دار(jagged arrays) که به موجب آن «ردیفها(row)» ممکن است اندازههای مختلفی داشته باشند، استفاده کنیم. برای انجام این کار، به یک آرایه نیاز داریم که هر عنصر آن یک آرایه ی دیگر باشد. همچنین می توانیم آرایه های آرایه های آرایه یا موقعیت های پیچیده تری نیز داشته باشیم. اما، تمام اینها تنها وقتی امکان پذیر است که این آرایه ها نوع(type) پایه ی یکسانی داشته باشند.
شیوه ی نوشتاری یا سینتکس برای تعریف آرایه درون آرایه به این صورت است که از چندین براکت مربعی در تعریف این آرایه ها به صورت زیر استفاده کنیم:
int[][] jaggedIntArray;
متاسفانه مقداردهی اویه ی آرایه هایی مانند این، به سادگی مقداردهی اولیه ی آرایه های چندبعدی نیست. بعنوان مثال، ما نمی توانیم تعریف قبلی را به صورت زیر دنبال کنیم:
jaggedIntArray = new int[3][4];
حتی اگر شما این کار را انجام دهید، خیلی مفید نخواهد بود زیرا با استفاده از آرایه های چندبعدی ساده، با تلاش کمتری می توانیم به همین تاثیر برسیم. همچنین نمیتوانید از کدی مانند این استفاده کنید:
jaggedIntArray = { { 1, 2, 3 }, { 1 }, { 1, 2 } };
دو گزینه در اختیار داریم. ما می توانیم آرایه ای که حاوی دیگر آرایه ها(برای وضوح بیشتر، این آرایه ها را زیر-آرایه می نامیم) است را مقداردهی اولیه کنیم و آنگاه زیر آرایه ها را به نوبه ی خود مقداردهی اولیه کنیم:
jaggedIntArray = new int[2][];
jaggedIntArray[0] = new int[3];
jaggedIntArray[1] = new int[4];
به طور جایگزین، می توانیم از یک شکل اصلاح شده از کدهای بالا به صورت زیر استفاده کنیم:
jaggedIntArray = new int[3][] { new int[] { 1, 2, 3 }, new int[] { 1 }, new int[] { 1, 2 } };
اگر آرایه را در همان خطی که تعریف شده است، مقداردهی اولیه کنیم، کار ساده تر خواهد شد:
int[][] jaggedIntArray = { new int[] { 1, 2, 3 }, new int[] { 1 }, new int[] { 1, 2 } };
ما می توانیم در حلقه های foreach از آرایه های دندانه دار(jagged arrays) استفاده کنیم، اما اغلب برای رسیدن به دادههای واقعی باید اینها را به صورت تو در تو بنویسیم. بعنوان مثال، فرض کنید یک آرایه ی دندانه دار به صورت زیر داریم که حاوی 10 آرایه است که هرکدام حاوی یک آرایه از اعداد صحیحی است که مقسوم علیه های یک عدد صحیح، بین 1 تا 10 هستند:
int[][] divisors1To10 = { new int[] { 1 },
new int[] { 1, 2 },
new int[] { 1, 3 },
new int[] { 1, 2, 4 },
new int[] { 1, 5 },
new int[] { 1, 2, 3, 6 },
new int[] { 1, 7 },
new int[] { 1, 2, 4, 8 },
new int[] { 1, 3, 9 },
new int[] { 1, 2, 5, 10 } };
کد زیر با شکست مواجه خواهد شد:
foreach (int divisor in divisors1To10)
{
WriteLine(divisor);
}
علت این شکست این است که آرایه ی divisors1To10 حاوی عناصر int[] است، نه عناصر int . به جای آن، شما باید روی هر زیرآرایه و همچنین روی خود آرایه حلقه بزنید:
foreach (int[] divisorsOfInt in divisors1To10)
{
foreach(int divisor in divisorsOfInt)
{
WriteLine(divisor);
}
}
همان طور که مشاهده می کنید، سینتکس استفاده از آرایه های دندانه دار می تواند خیلی سریع، پیچیده شود. در اکثر موارد، این ساده تر است که از آرایه های مستطیلی(rectangular arrays) یا یک روش ذخیره سازی ساده تر استفاده کنیم. با این وجود، ممکن است موقعیتهایی وجود داشته باشد که مجبور به استفاده از این روش شویم. یک مثالش وقتی است که با سندهای XML کار می کنیم؛ که برخی عناصر حاوی عناصر فرزند هستند و برخی عنصر فرزند ندارند.
- بازدید: 84
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.