در این مقاله، به بررسی حلقه foreach در سی شارپ و تفاوتهای دو نوع حلقه foreach و for، نحوه عملکرد، و محدودیتهای آنها خواهیم پرداخت تا بتوانید بر اساس نیازهای پروژه خود بهترین انتخاب را داشته باشید.
مقدمه
در برنامهنویسی، حلقهها یکی از مفاهیم اساسی و پرکاربرد هستند که به ما امکان میدهند تا یک مجموعه از دستورات را بهصورت مکرر و تا زمان برآورده شدن یک شرط خاص اجرا کنیم. حلقهها در زبانهای برنامهنویسی مختلف به اشکال گوناگون پیادهسازی میشوند، اما دو نوع متداول آنها، حلقههای for و foreach هستند. هر یک از این حلقهها ویژگیها، مزایا و محدودیتهای خاص خود را دارند.
ساختار حلقه foreach در سی شارپ
حلقه در زبانهای برنامهنویسی روشی است برای اجرای یک عبارت یا مجموعهای از دستورات بهطور مکرر تا زمانی که یک شرط خاص برقرار باشد. این شرط باید درست باشد تا حلقه ادامه پیدا کند و دستورات داخل آن اجرا شوند. حلقه foreach در سی شارپ برای مرور و پیمایش عناصر یک مجموعه به کار میرود. این مجموعه میتواند یک آرایه یا یک لیست باشد و حلقه بهطور خودکار برای هر عنصر موجود در آن مجموعه اجرا میشود.
در استفاده از حلقهی foreach، ضروری است که:
- دستورات داخل حلقه را در آکولادها {} قرار دهید.
- بهجای تعریف و مقداردهی یک متغیر شمارنده برای حلقه، شما یک متغیر جدید تعریف میکنید که نوع آن باید مشابه نوع دادههای موجود در آرایه باشد.
- پس از آن، نام آرایه به همراه یک دونقطه : آورده میشود.
- در بدنهی حلقه میتوانید از متغیر تعریفشده بهعنوان نمایندهی هر عنصر استفاده کنید، بدون اینکه نیازی به استفاده از ایندکس مشخص برای دسترسی به آن عنصر در آرایه داشته باشید.
ساختار syntax
foreach(data_type var_name in collection_variable) { // statements to be executed }
فلوچارت حلقه foreach در سی شارپ
فلوچارت برای حلقه foreach در زبان سیشارپ نشاندهندهی نحوهی اجرای این حلقه است. فلوچارت مربوط به حلقه foreach در زبان #C به صورت زیر است:
مثال برای حلقه foreach در سی شارپ
کد زیر یک برنامه ساده در زبان #C است که از حلقه foreach برای پیمایش یک آرایه و چاپ مقادیر آن استفاده میکند.
// C# program to illustrate the // use of foreach loop using System; class PStore { // Main Method static public void Main() { Console.WriteLine("Print array:"); // creating an array int[] a_array = new int[] { 1, 2, 3, 4, 5, 6, 7 }; // foreach loop begin // it will run till the // last element of the array foreach(int items in a_array) { Console.WriteLine(items); } } }
خروجی: وقتی برنامه اجرا شود، اعداد موجود در آرایه به ترتیب زیر نمایش داده میشوند.
Print array: ۱ ۲ ۳ ۴ ۵ ۶ ۷
توضیح: حلقه foreach در برنامه فوق معادل است با:
for(int items = 0; items < a_array.Length; items++) { Console.WriteLine(a_array[items]); }
مثال: کد زیر به زبان سیشارپ نوشته شده و هدف آن یافتن بیشترین مقدار در یک آرایه با استفاده از حلقه foreach است.
// C# program to illustrate // foreach loop using System; class For_Each { // Main Method public static void Main(String[] arg) { { int[] marks = { 125, 132, 95, 116, 110 }; int highest_marks = maximum(marks); Console.WriteLine("The highest score is " + highest_marks); } } // method to find maximum public static int maximum(int[] numbers) { int maxSoFar = numbers[0]; // for each loop foreach (int num in numbers) { if (num > maxSoFar) { maxSoFar = num; } } return maxSoFar; } }
خروجی
The highest score is 132
محدودیت های حلقه foreach در سی شارپ
- زمانی که قصد دارید عناصر آرایه را تغییر دهید یا بهطور مستقیم آنها را اصلاح کنید، حلقههای foreach مناسب نیستند.
foreach(int num in marks) { // only changes num not // the array element num = num * 2; }
- حلقه foreach در سی شارپ شاخص «Index» آرایه را دنبال نمیکنند، بنابراین نمیتوان از طریق این حلقه به ایندکسهای هر عنصر در آرایه دسترسی پیدا کرد. این حلقهها صرفاً برای دسترسی به مقادیر عناصر آرایه طراحی شدهاند و بهطور خودکار و پشتصحنه برای هر عنصر از مجموعه، عملیات را انجام میدهند بدون اینکه ایندکس آن عنصر را نمایش دهند.
foreach (int num in numbers) { if (num == target) { return ???; // do not know the index of num } }
- حلقهی foreach تنها بهصورت گامبهگام و به ترتیب از ابتدا تا انتهای آرایه یا مجموعه تکرار میکند و نمیتواند بهطور معکوس یا با تغییر ترتیب عناصر عمل کند.
/ cannot be converted to a foreach loop for (int i = numbers.Length - 1; i > 0; i--) { Console.WriteLine(numbers[i]); }
تفاوت بین حلقه for و foreach در سی شارپ
- حلقهی for یک دستور یا بلوک دستورات را تا زمانی که شرط دادهشده نادرست شود، اجرا میکند. در حالی که حلقهی foreach یک دستور یا بلوک دستورات را برای هر عنصر موجود در آرایه اجرا میکند و نیازی به تعریف حداقل یا حداکثر مقدار ندارد.
- در حلقهی for، میتوان آرایه را هم در جهت رو به جلو (مثلاً از ایندکس ۰ تا ۹) و هم در جهت معکوس (مثلاً از ایندکس ۰ تا ۹) پیمایش کرد. اما در حلقهی foreach، آرایه تنها در جهت رو به جلو پیمایش میشود و امکان پیمایش در جهت معکوس وجود ندارد.
- از نظر تعریف متغیر، حلقهی foreach شامل پنج تعریف متغیر است، در حالی که حلقهی for تنها شامل سه تعریف متغیر میباشد.
- حلقهی foreach آرایه را کپی کرده و این کپی را در آرایهی جدیدی برای انجام عملیات قرار میدهد. در حالی که حلقهی for این کار را انجام نمیدهد.
جمع بندی
حلقههای for و foreach هر دو ابزارهای قدرتمندی در برنامهنویسی برای پیمایش و مدیریت دادهها هستند. حلقه for انعطافپذیری بیشتری ارائه میدهد و به برنامهنویس این امکان را میدهد که آرایهها را بهصورت دلخواه، چه در جهت جلو و چه در جهت عقب، پیمایش کند. همچنین برای شرایطی که نیاز به دسترسی به شاخص یا تغییر مستقیم در عناصر آرایه وجود دارد، مناسبتر است.
از سوی دیگر، حلقه foreach در سی شارپ به دلیل سادگی در استفاده و تمرکز بر پیمایش عناصر بدون درگیر شدن با شاخصها، گزینهای ایدهآل برای کار با مجموعههایی است که تغییر در آنها موردنیاز نیست. با این حال، محدودیتهای آن مانند عدم امکان پیمایش معکوس یا تغییر مستقیم عناصر آرایه باید در نظر گرفته شود.
به طور کلی، انتخاب بین for و foreach به نیازهای خاص پروژه و نوع عملیاتی که روی دادهها انجام میشود بستگی دارد. درک دقیق تفاوتها و کاربردهای این دو نوع حلقه میتواند به برنامهنویسان کمک کند تا کدی بهینهتر، خواناتر و مؤثرتر بنویسند.