آموزش سی شارپ مقدماتی (بخش هجدهم - آرایه ها):


با عرض سلام و احترام.
پیشاپیش از شما دوست عزیز و گرامی، بابت وقتی که برای مطالعه ی این مطلب خواهید گذاشت، سپاسگزارم.
تقاضا دارم، در صورت مشاهده ی اشتباه متنی یا محتوایی، به اینجانب اطلاع دهید تا (ضمن کمک به یادگیری بنده) در اسرع وقت برای اصلاح متن اقدام نمایم.
شماره ی تماس:
09215149218
نشانی پست الکترونیکی:
RezaQadimi.ir@Gmail.com
آدرس کدها:
Learning-CSharp-Fundamental
آدرس سایت ها:
https://Reza-Qadimi.ir - https://WannaDate.ir

آرایه:

آرایه نوع داده ای ست که میتواند مقادیری را به صورت دنباله ای در خودش ذخیره کند. در واقع ما از آرایه برای تعریف یک لیست، با نوع مشخصی از داده (string, int, bool و...)، و با تعداد مشخصی متغیر (آیتم/خانه) استفاده می کنیم.


۱. آرایه در دسته ی متغیرهای Reference Type قرار می گیرد.

۲. ما برای این که بتوانیم با متغیرهای Reference Type کار کنیم (به غیر از string ها)، دو راه پیش رو داریم:

  • یا باید آن ها را new کنیم.
  • یا باید به یک شی از قبل new شده اشاره کنند.

۳. در زبان های C Base، همه ی آرایه ها و collection ها zero based هستن (اندیس اولین آیتم آن ها از 0 شروع می شود).

۴. آرایه ها وقتی new شوند، دیگر قابل resize شدن نیستند (از دلایلی که باعث می شود، کم تر از آرایه ها استفاده نماییم).

نکته: هر چند نمی توانیم بعد از خلق آرایه طول آن را تغییر دهیم، اما می توانیم در زمان خلق، تعداد آیتم های آن را به صورت پارامتریک مشخص نماییم.

همانطور که قبلا عرض کردم، متغیرهایی که در stack قرار می گیرند (یا allocate می شوند)، مطلقا مقدار اولیه ندارند (یعنی حتی نباید بگوییم که null هستند)، و برعکس، همه ی متغیرهایی که در Heap قرار می گیرند، اتفاقا مقدار اولیه ی مشخص دارند!

نکته: بهتر است، نام آرایه را به صورت جمع تعریف کنیم تا خوانایی کدهای مان را بالاتر ببریم. مثال:

people, users, names, countries, ...


تعریف آرایه:

برای تعریف آرایه، راه های مختلفی داریم.

variableType[] arrayName =
    new variableType[itemsCount];

arrayName[index] = value;


  • arrayName:

نام آرایه

  • itemsCount:

تعداد اعضا (آیتم یا خانه هایی) که می خواهیم آرایه مان داشته باشد.

  • index:

اندیس آیتمی که میخواهیم به آن مقداردهی کنیم، یا مقدار آن را بخوانیم.

  • value:

مقداری که به عنوان value آن خانه (خانه ای با اندیس index) از آرایه، در نظر داریم.

  • variableType:

نوع متغیری که قصد داریم، آرایه ای از آن جنس داشته باشیم (string, int, bool, etc).


  • روش اول: تعریف آرایه، و مقداردهی در زمانی دیگر.
string[] usernames = new string[1];
usernames[0] = &quotRezaQadimi.ir&quot ;


نکته: می توانیم از حلقه ها، برای مقداردهی به آرایه مان استفاده نماییم:

string[] usernames = new string[5];

for (int index = 0; index < 5; index++)
{
    string username =
        System.Console.ReadLine();

    usernames[index] = username;
}

  • روش دوم: تعریف آرایه و مقداردهی به صورت همزمان.
string[] usernames =
    new string[5] { &quotReza&quot, &quotAli&quot, &quotPouria&quot, &quotHamid&quot, &quotMorteza&quot };

پی نوشت: در صورتی که از این روش استفاده می نمایید، باید حتما به اندازه ی عددی که به عنوان تعداد خانه های آرایه تان مشخص نموده اید، "در همان لحظه" به آرایه تان مقداردهی نمایید! در غیر این صورت با Compile Error مواجه خواهید شد.


  • روش سوم: تعریف آرایه و مقداردهی همزمان، بدون مشخص کردن طول آرایه.
string[] usernames =  { &quotReza&quot, &quotAli&quot, &quotPouria&quot, &quotHamid&quot, &quotMorteza&quot };

کار کردن با آرایه ها:


  • Note: Compile Error!
int[] numbers;
numbers[2] = 1995;

پی نوشت: برای کار کردن با موجودات Reference Type، یا باید آن ها را new کرد، یا...


  • Note: OK
int[] numbers;
numbers = new int[5];
numbers[2] = 1995;


  • Note: Runtime Error!
int[] numbers;
numbers = new int[5];
numbers[5] = 1995;

پی نوشت: اندیس اولین خانه/آیتم آرایه ها در زبان های C Base، از 0 شروع می شود. بنابراین اندیس آخرین خانه از یک آرایه، برابر است با تعداد خانه های مشخص شده برای آن آرایه، منهای یک!



  • Note: OK
int[] numbers = new int[5];

numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 3;
numbers[3] = 15;
numbers[4] = 1060;


  • Note: OK
int[] numbers = { 10, 20, 3, 15, 1060 };

آرایه ی دو بعدی:

در آرایه های دو بعدی، هم می توانیم تعداد ستون ها را مشخص نماییم، و هم تعداد ردیف ها را.

نکته: از آرایه های دو بعدی، بیشتر برای ترسیم اشکال و مشخص کردن موقعیت روی نقشه استفاده می کنیم.

| 1 2 | → row
| 3 4 |

column


  • تعریف آرایه و مقداردهی در زمانی دیگر.
int[,] numbers = new int[2, 2];

numbers[0, 0] = 1;
numbers[0, 1] = 2;
numbers[1, 0] = 3;
numbers[1, 1] = 4;


  • تعریف آرایه و مقداردهی به صورت همزمان.
int[,] numbers = new int[,] { { 1, 2 }, { 3, 4 } };


  • تعریف آرایه و مقداردهی همزمان، بدون مشخص کردن طول آرایه.
int[,] numbers = { { 1, 2 }, { 3, 4 } };


  • تعریف آرایه و استفاده از حلقه ی for، جهت مقداردهی به خانه های آرایه:
int row =
    System.Convert.ToInt32(System.Console.ReadLine());

int column =
    System.Convert.ToInt32(System.Console.ReadLine());

int[,] numbers = new int [row, column];

for (int rowIndex = 0; rowIndex <= row - 1; rowIndex++)
{
    for (int columnIndex = 0; columnIndex <= column - 1; columnIndex ++)
    {
        int input =
            System.Convert.ToInt32(System.Console.ReadLine());

        numbers[rowIndex, columnIndex ] = input;
    }
}

foreach:

علاوه بر حلقه هایی که در مقاله ی قبل بررسی کردیم، حلقه ی دیگری داریم به نام foreach.

  • به وسیله ی این حلقه، می توانیم به راحتی به همه ی متغیرهای آرایه (یا هر مجموعه ی دیگری) دسترسی داشته باشیم (یعنی آن ها را بخوانیم، یا اصطلاحا پیمایش کنیم).
  • نمیتوانیم از آن برای مقداردهی به خانه های آرایه استفاده کنیم(می توانیم، اما با روشی غیر هوشمندانه).
  • نمی توانیم value آیتم های آن را تغییر بدهیم (می توانیم، اما با روشی غیر هوشمندانه).
foreach ([Data Type] [Variable Name]  in  [Array/Collection Name])
{
    // Statement(s)
}


  • Data Type:

نوع متغیری، که قرار است آرایه ای از آن جنس را مورد بررسی/پیمایش قرار دهیم.


  • Variable Name:

اصطلاحا نامیست که به آیتم کنونی آرایه می دهیم و می خواهیم آن را مورد بررسی قرار دهیم (نام آن مهم نیست، و می تواند هر چیزی باشد (با رعایت نکات syntax ی سی شارپ)، اما معمولا از کلمات General مثل item استفاده می نماییم تا هزینه ی تغییرات بعدی، یا copy-paste را کمتر کنیم).


  • Array/Collection Name:

نام آرایه (یا کالکشنی) که قرار است آیتم های آن را مورد بررسی قرار دهیم.


مثال:

string[] usernames =
     { &quotReza&quot, &quotAli&quot, &quotPouria&quot, &quotHamid&quot, &quotMorteza&quot };

foreach (string item in usernames)
{
    System.Console.WriteLine(item);
}

System.Console.ReadLine();

پی نوشت: زمانی که صرفا قصد پیمایش یا خواندن خانه های یک آرایه را داریم، استفاده از حلقه ی foreach، حرفه ای تر، و شیک تر است.


چند سوال:

- آیا می توانیم از انتهای آرایه، به ابتدای آرایه بیایم؟
- آیا می توانیم value خانه های آرایه را کم یا زیاد کنیم؟
- آیا می توانیم از ابتدا به انتهای آرایه، خانه های آرایه را یکی در میان، یا... مقداردهی کنیم یا پیمایش نماییم؟

خواندن این مقاله از استاد داریوش تصدیقی توصیه می شود:

آموزش #C مقدماتی - آموزش ArrayList

پی نوشت: در مقاله ی بعد، به آشنایی با متدها در زبان سی شارپ می پردازیم.


معرفی:
رضا قدیمی هستم. برنامه نویس و دانش آموزِ حوزه ی وب، بسیار مشتاق در یادگیری مفاهیم و اطلاعات جدید در این حوزه.