حلقه 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 است.
سلام
وقت بخیر این ساختار شما یعنی foreach (datatype temporaryVar in array) بهتر تبدیل بشه به foreach (datatype temporaryVar in collection) منظور از collection هم یعنی مجموعه حالا این مجموعه می تونه Dictionary ، Array و غیر باشه
با تشکر
سلام ممنون از توضیحات عالیتون فقط یه سوال اونم اینکه تو حلقه foreach میتونیم کاری کنیم ک اعداد بر عکس چاپ بشه؟در حلقه forکه دارای گام پرش هست ممکنه ولی در foreach کمی برام مشکل ساز شد ممنون میشم اگر کمکم کنید
سلام، خیلی لطف دارین
با حلقه forech نمیشه. باید اول مقادیرتون رو تو یه لیست یا آرایه بریزین و با متد ()Reverse این این کار رو بکنید. به مثال زیر توجه کنید
سایتتون فوق العادست من از همون روز اول که میخوام برنامه نویسی یاد بگیرم عضو سایت شما شدم و چقدر خوش شانسم که سایت شما رو دیدم. تا به اینجا هم مرحله به مرحله اومدم جلو و خیلی راضیم هم از سایت شما هم از عملکردم همه چی کامل و مفید ممنون از شما
نظر لطفتونه، خوشحالم که مطالب براتون مفید بوده. موفق و موید باشید
با سلام و خسته نباشید
ممنون از توضیحات عالیتون…
در مورد حلقه foraech یه توضیحی که به نظرم جاش خالیه و بودنش تو فهم بهتر مطلب کمک میکنه اینه که این حلقه یه ضعف دیگه هم داره :
ما نمی دونیم این عنصری که الآن مقدارش توی temporaryvar قرار گرفته چندمین عنصر آرایست!مثلا این کد رو که با for معمولی نوشته شده رو نمی تونیم با foreach بنویسیم:
توی این کد هر عنصر توی اندیس اون عنصر ضرب شده که با foreach خالی نمی شه نوشتش...
با هم تشکر میکنم از شما بخاطر زحمات و شیوه عالی در ارائه این مطالب...
سلام بسیار ممنون بابت لطف و نکته ای که یادآوری کردین. با اجازتون به آخر مطلب اضافش کردم.