حلقه foreach

حلقه foreach یکی دیگر از ساختارهای تکرار در سی شارپ می‌باشد که مخصوصاً برای آرایه‌ها، لیست‌ها و مجموعه‌ها طراحی شده است. حلقه foreach با هر بار گردش در بین اجزاء، مقادیر هر یک از آنها را در داخل یک متغیر موقتی قرار می‌دهد و شما می‌توانید بواسطه این متغیر به مقادیر دسترسی پیدا کنید. در زیر نحوه استفاده از حلقه foreach آمده است :

foreach (datatype temporaryVar in array)
{
    code to execute;
}

temporaryVar متغیری است که مقادیر اجزای آرایه را در خود نگهداری می‌کند.temporaryVar باید دارای نوع باشد تا بتواند مقادیر آرایه را در خود ذخیره کند. به عنوان مثال آرایه شما دارای اعدادی از نوع صحیح باشد باید نوع متغیر موقتی از نوع اعداد صحیح باشد یا هر نوع دیگری که بتواند اعداد صحیح را در خود ذخیره کند مانند double یا long. سپس کلمه کلیدی in و بعد از آن نام آرایه را می‌نویسیم. در زیر نحوه استفاده از حلقه foreach آمده است :

   1: using System;
   2: 
   3: public class Program
   4: {
   5:     public static void Main()
   6:     {
   7:         int[] numbers = { 1, 2, 3, 4, 5 };
   8: 
   9:         foreach (int n in numbers)
  10:         {
  11:             Console.WriteLine("Number {0}", n);
  12:         }
  13:     }
  14: }
Number 1
Number 2
Number 3
Number 4
Number 5

در برنامه آرایه‌ای با 5 جزء تعریف شده و مقادیر 1 تا 5 در آنها قرار داده شده است (خط 7). در خط ۹ حلقه foreach شروع می‌شود. ما یک متغیر موقتی تعریف کرده‌ایم که اعداد آرایه را در خود ذخیره می‌کند. در هر بار تکرار از حلقه foreach متغیر موقتی n ، مقادیر عددی را از آرایه استخراج می‌کند. حلقه foreach مقادیر اولین تا آخرین جزء آرایه را در اختیار ما قرار می‌دهد.

حلقه foreach برای دریافت هر یک از مقادیر آرایه کاربرد دارد. بعد از گرفتن مقدار یکی از اجزای آرایه، مقدار متغیر موقتی را چاپ می‌کنیم. حلقه foreach یک ضعف دارد و آن اینست که این حلقه ما را قادر می‌سازد که به داده‌ها دسترسی یابیم و یا آنها را بخوانیم ولی اجازه اصلاح اجزاء آرایه را نمی‌دهد. برای درک این مطلب در مثال زیر سعی شده است که مقدار هر یک از اجزا آرایه افزایش یابد :

int[] numbers = { 1, 2, 3 };

foreach(int number in numbers)
{
   number++;
}

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

int[] numbers = { 1, 2, 3 };

for (int i = 0; i < number.Length; i++)
{
   numbers[i]++;
}

این حلقه یه ضعف دیگر نیز دارد و آن این است که ما نمی‌توانیم با استفاده از حلقه foreach به اندیس عناصر آرایه دست یابیم، مثلاً کد زیر که با حلقه for نوشته شده است را نمی‌توانیم با حلقه foreach پیاده سازی کنیم:

int[] number = {1, 2, 3, 4};

for (int i = 0; i < number.Length; i++)
{
    Console.WriteLine(number[i]);
}

البته این ضعف نیز به نوعی ناشی از غیر قابل ویرایش بودن عناصر آرایه در حلقه foreach است.