آرایهها یکی از ساختارهای دادهای پرکاربرد در برنامهنویسی هستند که برای ذخیرهسازی و دسترسی به مجموعهای از دادهها استفاده میشوند. در این مقاله به معرفی و بررسی انواع مختلف آرایه ها در سی شارپ پرداخته میشود. ابتدا به تشریح آرایههای یکبعدی «One Dimensional Array» و نحوه دسترسی به عناصر آنها خواهیم پرداخت، سپس آرایههای چندبعدی «Multidimensional Arrays» و دندانهدار «Jagged Arrays» معرفی شده و روشهای مختلف اعلان «Declaration»، مقداردهی اولیه «initialization» و دسترسی به عناصر «Access to elements» آنها با استفاده از حلقهها و متدها بررسی میشود.
آرایه در سی شارپ
آرایه یک گروه از متغیرهای همنوع است که با یک نام مشترک به آنها ارجاع داده میشود. هر دادهای در آرایه یک عنصر از آرایه نامیده میشود. نوع دادههای عناصر ممکن است هر نوع داده معتبر مانند char، int، float و غیره باشد و این عناصر در مکانهای پیوسته ذخیره میشوند. طول آرایه تعداد عناصری که در آرایه وجود دارد را مشخص میکند.
طول آرایه تعداد عناصری است که در آن قرار دارند. در زبان C#، حافظه آرایهها به صورت پویا تخصیص داده میشود و آرایهها خود نوعی شیء محسوب میشوند. به همین دلیل، اندازه آنها به راحتی با استفاده از توابع از پیش تعریفشده قابل محاسبه است. عناصر آرایه به ترتیب مرتب شدهاند و هرکدام یک شاخص یا ایندکس دارند که از صفر شروع میشود. آرایه ها در سی شارپ به شیوهای متفاوت نسبت به زبانهای C یا سی پلاس پلاس «++C» عمل میکنند.
نکات مهمی که باید درباره آرایهها به یاد داشته باشید:
- در زبان برنامه نویسی#C، تمام آرایهها به طور پویا تخصیص داده میشوند.
- از آنجا که آرایه ها در سی شارپ شیء هستند، میتوان طول آنها را با استفاده از عضو length پیدا کرد. این با C++/C متفاوت است که در آن طول با استفاده از عملگر sizeof به دست میآید.
- یک متغیر آرایهای در #C نیز مانند سایر متغیرها با استفاده از [] بعد از نوع داده اعلام میشود.
- متغیرهای موجود در آرایه به ترتیب مرتب شدهاند و هرکدام یک ایندکس دارند که از ۰ شروع میشود.
- آرایه #C یک شیء از نوع پایه System.Array است.
- مقادیر پیشفرض عناصر آرایههای عددی و انواع مرجعی به ترتیب صفر و null تنظیم میشود.
- عناصر یک آرایهی دندانه دار «jagged array» انواع مرجع هستند و به طور پیشفرض به null مقداردهی میشوند.
- عناصر آرایه میتوانند از هر نوعی باشند، از جمله نوع آرایه.
- انواع آرایهها از انواع مرجع هستند که از نوع پایه انتزاعی Array مشتق شدهاند. این انواع، IEnumerable را پیادهسازی میکنند و برای آن از تکرار foreach برای تمام آرایه ها در سی شارپ استفاده میشود.
آرایه میتواند شامل انواع دادههای ابتدایی مانند عدد صحیح، اعشاری و همچنین اشیاء از کلاسها باشد، بسته به تعریفی که از آرایه شده است. وقتی از دادههای اولیه استفاده میکنید، مقادیر در مکانهای حافظه پیوسته ذخیره میشوند. اما در صورت استفاده از اشیاء یک کلاس، این اشیاء در بخش heap حافظه ذخیره میشوند.
شکل زیر نحوه ذخیرهسازی مقادیر در آرایه به طور متوالی را نشان میدهد:
توضیح: ایندکس از ۰ شروع میشود که مقدار را ذخیره میکند. همچنین میتوانیم تعداد مشخصی از مقادیر را در یک آرایه ذخیره کنیم. ایندکس آرایه باید به ترتیب و هر بار که به اندازه آرایه نرسید، ۱ افزایش یابد.
تعریف آرایه در سی شارپ
در زبان برنامهنویسی سیشارپ #C، آرایه یک ساختار داده است که میتواند مجموعهای از عناصر همنوع را در خود ذخیره کند. هر عنصر در آرایه با استفاده از یک ایندکس (شاخص) قابل دسترسی است. آرایه ها در سی شارپ از نوع دادهای خاصی هستند و میتوانند اندازهای ثابت داشته باشند.تعریف یا اعلان آرایه به عملی اطلاق میشود که در آن یک آرایه به زبان برنامهنویسی معرفی شده و نوع دادهای آن مشخص میشود. به طور کلی اعلان آرایه «Array Declaration» به معنای اعلام نام، نوع داده و تخصیص فضایی برای آرایه است. این عمل برای ذخیره دادهها در یک ساختار دادهای که به راحتی قابل دسترسی باشد، ضروری است.
ساختار «Syntax» تعریف آرایه در سی شارپ
< Data Type > [ ] < Name_Array >
توضیح:
- < Data Type >: نوع دادهای است که نوع عناصر آرایه را مشخص میکند.
- [ ]: این علامت اندازه آرایه را مشخص میکند.
- < Name_Array >: نام آرایه است.
مثال
int[] x; // can store int values string[] s; // can store string values double[] d; // can store double values Student[] stud1; // can store instances of Student class which is custom class
توجه: فقط اعلان یک آرایه حافظهای برای آن تخصیص نمیدهد. برای این منظور، باید آرایه مقداردهی اولیه «Initialization» شود.
مقداردهی اولیه آرایه در سی شارپ
همانطور که قبلاً گفته شد، آرایه یک نوع مرجع است، بنابراین از کلمه کلیدی new برای ایجاد یک نمونه از آرایه استفاده میشود. ما میتوانیم عناصر فردی آرایه را با کمک ایندکس مقداردهی اولیه کنیم.
syntax
type [ ] < Name_Array > = new < datatype > [size];
ساختار | موارد استفاده | مثال |
;<data_type>[] <arr_name> = new <data_type>[size] | تعریف آرایه با تعیین اندازه، اما بدون تخصیص مقادیر. | ;int[] arr1 = new int[5] |
<data_type>[] <arr_name> = new <data_type>[size]{ ;array_elements} | تعریف آرایه با تعیین اندازه و تخصیص مقادیر بهطور همزمان. | ;int[] arr2 = new int[5]{1, 2, 3, 4, 5} |
<data_type>[] <arr_name> = { array_elements}; | مقدار آرایه مستقیماً مقداردهی اولیه میشود بدون اینکه اندازه آن تعیین شود. | ;int[] intArray3 = {1, 2, 3, 4, 5} |
مقداردهی اولیه آرایه در سی شارپ پس از تعریف
آرایهها میتوانند پس از اعلان، مقداردهی اولیه شوند. لازم نیست که اعلان و مقداردهی اولیه بهطور همزمان با استفاده از کلمه کلیدی new انجام شود. با این حال، هنگام مقداردهی اولیه آرایه پس از اعلام، باید از کلمه کلیدی new استفاده شود. آرایه نمیتواند تنها با تخصیص مقادیر مقداردهی اولیه شود.
مثال مقداردهی اولیه آرایه در سی شارپ
// Declaration of the array string[] str1, str2; // Initialization of array str1 = new string[5]{ “Element 1”, “Element 2”, “Element 3”, “Element 4”, “Element 5” }; str2 = new string[5]{ “Element 1”, “Element 2”, “Element 3”, “Element 4”, “Element 5” };
توجه: مقداردهی اولیه بدون تعیین اندازه در #C معتبر نیست. این باعث بروز خطای زمان کامپایل خواهد شد.
مثال برای اعلام اشتباه مقداردهی اولیه به آرایه در سی شارپ
// Compile-time error: must give size of an array int[] intArray = new int[]; // Error : wrong initialization of an array string[] str1; str1 = {“Element 1”, “Element 2”, “Element 3”, “Element 4” };
دسترسی به عناصر آرایه در سی شارپ
در زمان مقداردهی اولیه، میتوانیم مقادیر را تخصیص دهیم. اما همچنین میتوانیم پس از اعلام و مقداردهی اولیه، مقادیر آرایه را بهصورت تصادفی با استفاده از ایندکس تخصیص دهیم. به مقادیر آرایه میتوان از طریق ایندکس دسترسی داشت. به این صورت که ایندکس عنصر را در داخل کروشهها همراه با نام آرایه قرار میدهیم.
مثال دسترسی به عناصر آرایه با حلقه
تکه کد زیر یک برنامه ساده به زبان #C است که نحوه ایجاد و استفاده از آرایهای از اعداد صحیح «Integer» را نشان میدهد.
// C# program to illustrate creating an array // of integers, puts some values in the array, // and prints each value to standard output. using System; namespace ProgramStore { class PStore { // Main Method public static void Main() { // declares an Array of integers. int[] intArray; // allocating memory for 5 integers. intArray = new int[5]; // initialize the first elements // of the array intArray[0] = 10; // initialize the second elements // of the array intArray[1] = 20; // so on... intArray[2] = 30; intArray[3] = 40; intArray[4] = 50; // accessing the elements // using for loop Console.Write("For loop :"); for (int i = 0; i < intArray.Length; i++) Console.Write(" " + intArray[i]); Console.WriteLine(""); Console.Write("For-each loop :"); // using for-each loop foreach(int i in intArray) Console.Write(" " + i); Console.WriteLine(""); Console.Write("while loop :"); // using while loop int j = 0; while (j < intArray.Length) { Console.Write(" " + intArray[j]); j++; } Console.WriteLine(""); Console.Write("Do-while loop :"); // using do-while loop int k = 0; do { Console.Write(" " + intArray[k]); k++; } while (k < intArray.Length); } } }
خروجی برنامه مقادیر آرایه را با استفاده از هر چهار نوع حلقه نمایش میدهد. خروجی به صورت زیر خواهد بود:
For loop : 10 20 30 40 50 For-each loop : 10 20 30 40 50 while loop : 10 20 30 40 50 Do-while loop : 10 20 30 40 50
در #C، آرایه نوعی داده است که به صورت مجموعهای از مقادیر از یک نوع خاص عمل میکند. از حلقهها برای پیمایش عناصر آرایه استفاده میشود. در مثال بالا حلقهها، متغیرهایی مانند i، j و k برای ردیابی موقعیت اندیس به کار رفتهاند. این برنامه نمونهای ساده برای یادگیری مفاهیم آرایه و حلقهها در زبان #C است.
انواع آرایه ها در سی شارپ
سه نوع آرایه که #C پشتیبانی میکند به شرح زیر است:
- آرایه یکبعدی «One Dimensional Array»
- آرایه چندبعدی «Multi Dimensional Array»
- آرایه دندانهدار «Jagged Array»
آرایه یک بعدی در سی شارپ
در این نوع آرایه فقط یک ردیف برای ذخیره مقادیر وجود دارد. تمامی مقادیر این آرایه بهصورت پیوسته ذخیره میشوند و از ایندکس ۰ تا اندازه آرایه ادامه دارند.
برای مثال، اعلام یک آرایه تکبعدی شامل ۵ عدد صحیح به این صورت است:
int[] arrayint = new int[5];
آرایه فوق شامل عناصر از arrayint[0] تا arrayint[4] است. در مثال بالا، عملگر new برای ایجاد آرایه و مقداردهی اولیه عناصر آن با مقادیر پیشفرض استفاده شده است. در مثال بالا، تمام عناصر با مقدار صفر مقداردهی اولیه شدهاند، زیرا نوع داده آرایه int است.
مثال: تکه کد زیر به زبان #C نوشته شده است و نحوه ایجاد و استفاده از یک آرایه رشتهای برای نمایش روزهای هفته را نشان میدهد.
// C# program to creating an array // of the string as week days, store // day values in the weekdays, // and prints each value. using System; namespace geeksforgeeks { class PStore { // Main Method public static void Main() { // declares a 1D Array of string. string[] weekDays; // allocating memory for days. weekDays = new string[] {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; // Displaying Elements of array foreach(string day in weekDays) Console.Write(day + " "); } } }
خروجی زمانی که این برنامه اجرا شود، خروجی به صورت زیر خواهد بود:
Sun Mon Tue Wed Thu Fri Sat
در مثال بالا تعداد عناصر آرایه (۷ عنصر) به طور خودکار از تعداد مقادیر مقداردهی شده تعیین میشود. نیازی به مشخص کردن صریح اندازه آرایه نیست. اگر بخواهید روزهای دیگری را به این آرایه اضافه کنید، کافی است مقادیر بیشتری در مقداردهی اولیه وارد کنید.
این کد یک مثال ساده و خوانا از استفاده از آرایههای رشتهای و پیمایش آنها با حلقه foreach است.
آرایه چندبعدی در سی شارپ
آرایه چندبعدی یکی از انواع آرایه ها در سی شارپ میباشد که شامل بیش از یک ردیف برای ذخیرهسازی مقادیر است. به آن آرایه مستطیلی «Rectangular Array» نیز گفته میشود در #C زیرا طول هر ردیف آن یکسان است. این آرایه میتواند یک آرایه ۲ بعدی، ۳ بعدی یا بیشتر باشد. برای ذخیرهسازی و دسترسی به مقادیر آرایه، نیاز به حلقههای تو در تو است. اعلام، مقداردهی اولیه و دسترسی به آرایه چندبعدی به صورت زیر است:
// creates a two-dimensional array of // four rows and two columns. int[, ] intarray = new int[4, 2]; //creates an array of three dimensions, 4, 2, and 3 int[,, ] intarray1 = new int[4, 2, 3];
مثال: تکه کد زیر به زبان #C نشاندهنده نحوه کار با آرایههای چندبعدی «multi-dimensional arrays» است.
// C# program to illustrate creating // an multi- dimensional array // puts some values in the array, // and print them using System; namespace ProgramStore { class Pstore { // Main Method public static void Main() { // Two-dimensional array int[, ] intarray = new int[, ] { { 1, 2 }, { ۳, ۴ }, { ۵, ۶ }, { ۷, ۸ } }; // The same array with dimensions // specified 4 row and 2 column. int[, ] intarray_d = new int[4, 2] { { 1, 2 }, { 3, 4 }, { ۵, ۶ }, { ۷, ۸ } }; // A similar array with string elements. string[, ] str = new string[4, 2] { { "one", "two" }, { "three", "four" }, { "five", "six" }, { "seven", "eight" } }; // Three-dimensional array. int[,, ] intarray3D = new int[,, ] { { { 1, 2, 3 }, { ۴, ۵, ۶ } }, { { ۷, ۸, ۹ }, { ۱۰, ۱۱, ۱۲ } } }; // The same array with dimensions // specified 2, 2 and 3. int[,, ] intarray3Dd = new int[2, 2, 3] { { { 1, 2, 3 }, { ۴, ۵, ۶ } }, { { ۷, ۸, ۹ }, { ۱۰, ۱۱, ۱۲ } } }; // Accessing array elements. Console.WriteLine("2DArray[0][0] : " + intarray[0, 0]); Console.WriteLine("2DArray[0][1] : " + intarray[0, 1]); Console.WriteLine("2DArray[1][1] : " + intarray[1, 1]); Console.WriteLine("2DArray[2][0] " + intarray[2, 0]); Console.WriteLine("2DArray[1][1] (other) : " + intarray_d[1, 1]); Console.WriteLine("2DArray[1][0] (other)" + intarray_d[1, 0]); Console.WriteLine("3DArray[1][0][1] : " + intarray3D[1, 0, 1]); Console.WriteLine("3DArray[1][1][2] : " + intarray3D[1, 1, 2]); Console.WriteLine("3DArray[0][1][1] (other): " + intarray3Dd[0, 1, 1]); Console.WriteLine("3DArray[1][0][2] (other): " + intarray3Dd[1, 0, 2]); // using nested loop show string elements Console.WriteLine("To String element"); for (int i = 0; i < 4; i++) for (int j = 0; j < 2; j++) Console.Write(str[i, j] + " "); } } }
خروجی
2DArray[0][0] : 1 2DArray[0][1] : 2 2DArray[1][1] : 4 2DArray[2][0] 5 2DArray[1][1] (other) : 4 2DArray[1][0] (other)3 3DArray[1][0][1] : 8 3DArray[1][1][2] : 12 3DArray[0][1][1] (other): 5 3DArray[1][0][2] (other): 9 To String element one two three four five six seven eight
در کد بالا از آرایههای دو بعدی و سه بعدی استفاده شده است. دسترسی به عناصر آرایه با استفاده از اندیسهای مختلف برای ابعاد مختلف صورت میگیرد. برای پیمایش آرایههای چند بعدی از حلقههای تو در تو استفاده شده است.
آرایه های دندانه دار در سی شارپ
آرایهای که عناصر آن خود آرایه هستند، بهعنوان آرایههای دندانهدار شناخته میشود، به این معنی که آرایهای از آرایهها است. عناصر آرایه دندانهدار ممکن است ابعاد و اندازههای مختلفی داشته باشند. در زیر مثالهایی برای نمایش نحوه اعلان مقداردهی اولیه و دسترسی به آرایههای دندانهدار آورده شده است.
مثال تکه کد زیر که به زبان سی شارپ نوشته شده یک آرایه دندانهدار یک بعدی را تعریف میکند که شامل سه آرایه دوتایی با اندازههای مختلف است. به عبارت دیگر، این برنامه آرایهای از آرایههای دوتایی مختلف را ذخیره میکند.
// C# program to single-dimensional jagged array // that contains two single-dimensional array // elements of different sizes. using System; namespace ProgramStore { class PStore { // Main Method public static void Main() { /*----------2D Array---------------*/ // Declare the array of two elements: int[][] arr = new int[2][]; // Initialize the elements: arr[0] = new int[5] { 1, 3, 5, 7, 9 }; arr[1] = new int[4] { 2, 4, 6, 8 }; // Another way of Declare and // Initialize of elements int[][] arr1 = { new int[] { 1, 3, 5, 7, 9 }, new int[] { 2, 4, 6, 8 } }; // Display the array elements: for (int i = 0; i < arr.Length; i++) { System.Console.Write("Element [" + i + "] Array: "); for (int j = 0; j < arr[i].Length; j++) Console.Write(arr[i][j] + " "); Console.WriteLine(); } } } }
خروجی
Element [0] Array: 1 3 5 7 9 Element [1] Array: 2 4 6 8
ممکن است که آرایههای دندانهدار و چندبعدی را با هم ترکیب کنیم. آرایه دندانهدار یک آرایه از آرایهها است و بنابراین عناصر آن از نوع مرجع هستند و به طور پیشفرض مقدار null دارند.
مثال: اعلام و مقداردهی اولیه به یک آرایه دندانهدار یکبعدی که شامل سه آرایه دوبعدی با اندازههای مختلف است
// C# program to single-dimensional jagged array // that contains three two-dimensional array // elements of different sizes. using System; namespace ProgramStore { class PStore { // Main Method public static void Main() { int[][, ] arr = new int[3][, ] {new int[, ] {{1, 3}, {5, 7}}, new int[, ] {{0, 2}, {4, 6}, {8, 10}}, new int[, ] {{11, 22}, {99, 88}, {0, 9}}}; // Display the array elements: for (int i = 0; i < arr.Length; i++) { int x = 0; for (int j = 0; j < arr[i].GetLength(x); j++) { for (int k = 0; k < arr[j].Rank; k++) Console.Write(" arr[" + i + "][" + j + ", " + k + "]:" + arr[i][j, k] + " "); Console.WriteLine(); } x++; Console.WriteLine(); } } } }
خروجی
arr[0][0, 0]:1 arr[0][0, 1]:3 arr[0][1, 0]:5 arr[0][1, 1]:7 arr[1][0, 0]:0 arr[1][0, 1]:2 arr[1][1, 0]:4 arr[1][1, 1]:6 arr[1][2, 0]:8 arr[1][2, 1]:10 arr[2][0, 0]:11 arr[2][0, 1]:22 arr[2][1, 0]:99 arr[2][1, 1]:88 arr[2][2, 0]:0 arr[2][2, 1]:9
نکاتی که باید به یاد داشته باشید
- GetLength(int): این متد تعداد عناصری را که در بعد اول آرایه وجود دارد باز میگرداند. برای دسترسی به طول ابعاد مختلف آرایههای چندبعدی، از این متد استفاده میشود.
- هنگام استفاده از آرایههای دندانهدار، باید احتیاط کنید زیرا اگر ایندکسی که میخواهید دسترسی پیدا کنید وجود نداشته باشد، استثناء IndexOutOfRangeException پرتاب خواهد شد.
جمع بندی
در این مقاله به بررسی انواع مختلف آرایه ها در سی شارپ پرداخته شد و نحوه استفاده از آرایههای یکبعدی، چندبعدی و دندانهدار با جزئیات توضیح داده شد. هر نوع آرایه با ویژگیها و مزایای خاص خود در شرایط مختلف کاربرد دارد. آرایههای یکبعدی برای ذخیرهسازی دادههای خطی مناسب هستند، در حالی که آرایههای چندبعدی و دندانهدار برای دادههای پیچیدهتر و ابعاد بالاتر طراحی شدهاند.
علاوه بر این، احتیاط در استفاده از آرایههای دندانهدار و درک ویژگیهایی مانند IndexOutOfRangeException میتواند به جلوگیری از بروز خطاهای رایج در کدنویسی کمک کند.
در نهایت، آگاهی از شیوههای مختلف اعلام، مقداردهی اولیه و دسترسی به عناصر آرایه ها در سی شارپ، به برنامهنویسان این امکان را میدهد که با انعطافپذیری بیشتری کدهای خود را طراحی کنند و به حل مسائل مختلف با ساختار دادههای آرایهای بپردازند.