حلقه های تو در تو (Nested Loops)

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

for (init; condition; increment)
{
   for (init; condition; increment)
   {
      //statement(s);
   }
   //statement(s);
}
while(condition)
{
   while(condition)
   {
      //statement(s);
   }
   //statement(s);
}
do
{
   //statement(s);
   do
   {
      //statement(s);
   }
   while(condition);

}
while(condition);

نکته‌ای که در مورد حلقه‌های تو در تو وجود دارد این است که، می‌توان از یک نوع حلقه در داخل نوع دیگر استفاده کرد. مثلاً می‌توان از حلقه for در داخل حلقه while استفاده نمود. در مثال زیر نحوه استفاده از این حلقه‌ها ذکر شده است. فرض کنید که می‌خواهید یک مستطیل با 3 سطر و 5 ستون ایجاد کنید :

   1: using System;
   2: 
   3: namespace NestedLoopsDemo
   4: {
   5:     class Program
   6:     {
   7:         static void Main(string[] args)
   8:         {
   9:             for (int i = 1; i <= 4; i++)
  10:             {
  11:                 for (int j = 1; j <= 5; j++)
  12:                 {                           
  13:                     Console.Write(" * ");   
  14:                 }                           
  15:                 Console.Write("\n");        
  16:             }
  17:         }
  18:     }
  19: }
 *  *  *  *  *
 *  *  *  *  *
 *  *  *  *  *
 *  *  *  *  *

در کد بالا به ازای یک بار اجرای حلقه for اول (خط 9)، حلقه for دوم (14-11) به طور کامل اجرا می‌شود. یعنی وقتی مقدار i برابر عدد 1 می‌شود، علامت * توسط حلقه دوم 5 بار چاپ می‌شود، وقتی i برابر 2 می‌شود، دوباره علامت * پنج بار چاپ می‌شود و … . در کل منظور از دو حلقه for این است که در 4 سطر علامت * در 5 ستون چاپ شود یا 4 سطر ایجاد شود و در هر سطر 5 بار علامت * چاپ شود. خط 15 هم برای ایجاد خط جدید است. یعنی وقتی حلقه داخلی به طور کامل اجرا شد، یک خط جدید ایجاد می‌شود و علامت‌های * در خطوط جدید چاپ می‌شوند. البته به جای این خط می‌توان Console.WriteLine(); را هم نوشت.