دسته بندی مقالات
- بیشتر -محصولات
- بیشتر -آخرین مقالات
- بیشتر --
پارتیشن بندی در پایگاه داده اوراکل
1403/08/30 -
Delegates در سی شارپ
1403/08/29 -
انواع ایندکس در پایگاه داده اوراکل
1403/08/28 -
سربارگذاری متدها در سی شارپ
1403/08/27 -
انواع پیوند ها (join) در پایگاه داده اوراکل
1403/08/26 -
پارامترهای توابع در سی شارپ
1403/08/25
حلقه foreach در سی شارپ
حلقه foreach در سی شارپ
در زبان برنامهنویسی سیشارپ (#C)، حلقهی foreach برای پیمایش عناصر یک مجموعه (مثل آرایهها، لیستها و سایر مجموعهها) استفاده میشود.
این حلقه یکی از سادهترین و کاربردیترین روشها برای دسترسی به عناصر یک مجموعه به ترتیب است.
حلقهی foreach در سیشارپ به برنامهنویسان این امکان را میدهد که بدون نیاز به مشخص کردن ایندکس (شاخص) عناصر، از اولین تا آخرین عنصر مجموعه را پیمایش کنند.
این حلقه بهویژه برای مواردی مناسب است که نیازی به تغییر یا حذف عناصر در طول پیمایش نداریم.
در این مقاله، نحوهی استفاده از حلقهی foreach، تفاوت آن با سایر حلقهها، کاربرد آن در آرایهها، و نکات مهمی که در استفاده از آن باید در نظر گرفت را بهطور کامل بررسی میکنیم.
ساختار کلی حلقهی foreach در سیشارپ
ساختار کلی حلقهی foreach به شکل زیر است:
foreach (نوع_داده متغیر in مجموعه)
{
// کدهایی که برای هر عنصر اجرا میشوند
}
در این ساختار:
-
نوع_داده نوع هر عنصر موجود در مجموعه را مشخص میکند.
-
متغیر نامی برای دسترسی به هر عنصر بهصورت موقت است.
-
مجموعه، آرایه یا هر مجموعهای است که میخواهیم آن را پیمایش کنیم.
مثال ساده از حلقهی foreach در آرایهها
برای درک بهتر، به مثالی از استفاده از foreach در آرایهها میپردازیم. فرض کنیم یک آرایه از اعداد صحیح داریم و میخواهیم هر عدد را چاپ کنیم.
int[] numbers = { 1, 2, 3, 4, 5 };
foreach (int number in numbers)
{
Console.WriteLine(number);
}
خروجی این برنامه به شکل زیر خواهد بود:
1
2
3
4
5
در اینجا، حلقهی foreach هر عنصر از آرایهی numbers را به ترتیب دریافت کرده و آن را درون متغیر number قرار میدهد و سپس با استفاده از Console.WriteLine چاپ میکند.
تفاوت حلقهی foreach با حلقهی for
هرچند که foreach و for هر دو میتوانند برای پیمایش عناصر یک مجموعه استفاده شوند، تفاوتهای مهمی بین آنها وجود دارد:
-
سادگی کد
در foreach نیازی به نوشتن کد اضافی برای مدیریت شاخص نیست.
در حالی که در for باید شاخص را بهصورت دستی مقداردهی و افزایش دهیم. -
خوانایی بیشتر
به دلیل اینکه foreach برای خواندن و پیمایش مستقیم عناصر طراحی شده است، کد خواناتر میشود و احتمال بروز خطا کاهش مییابد. -
عدم تغییر عناصر
در foreach شما فقط میتوانید عناصر را بخوانید، اما نمیتوانید مستقیماً آنها را تغییر دهید.
در صورتی که نیاز به تغییر عناصر در طول پیمایش دارید، باید از for یا سایر روشها استفاده کنید.
مثالی از حلقهی for برای مقایسه:
for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine(numbers[i]);
}
در اینجا لازم است که از متغیر i بهعنوان شاخص استفاده کنیم و با دسترسی به numbers[i] هر عنصر را چاپ کنیم.
کاربرد حلقهی foreach در انواع مجموعهها
علاوه بر آرایهها، foreach میتواند در انواع مختلفی از مجموعهها مانند List، Dictionary، HashSet و سایر کلاسهای پیادهسازی شده از IEnumerable استفاده شود.
در اینجا به مثالهایی از کاربرد foreach در مجموعههای مختلف اشاره میکنیم.
-
لیستها (List)
لیستها به دلیل انعطافپذیری و قابلیت اضافه و حذف کردن عناصر بهطور داینامیک، پرکاربرد هستند.
فرض کنیم یک لیست از رشتهها داریم:
List<string> names = new List<string> { "Ali", "Sara", "Reza" };
foreach (string name in names)
{
Console.WriteLine(name);
}
خروجی:
Ali
Sara
Reza
-
دیکشنریها (Dictionary)
در دیکشنریها، هر عنصر یک جفت کلید و مقدار دارد.
هنگام استفاده از foreach، میتوان به هر دوی کلید و مقدار دسترسی داشت.
Dictionary<int, string> students = new Dictionary<int, string>
{
{ 1, "Ali" },
{ 2, "Sara" },
{ 3, "Reza" }
};
foreach (KeyValuePair<int, string> student in students)
{
Console.WriteLine($"ID: {student.Key}, Name: {student.Value}");
}
خروجی:
ID: 1, Name: Ali
ID: 2, Name: Sara
ID: 3, Name: Reza
-
مجموعهها (HashSet)
HashSet یک نوع مجموعه است که از عناصر تکراری جلوگیری میکند.
از foreach برای پیمایش عناصر HashSet نیز میتوان استفاده کرد.
HashSet<string> uniqueNames = new HashSet<string> { "Ali", "Sara", "Reza", "Sara" };
foreach (string name in uniqueNames)
{
Console.WriteLine(name);
}
در اینجا، HashSet فقط یکبار Sara را ذخیره میکند، بنابراین تکراریها حذف میشوند.
محدودیتها و نکات مهم حلقهی foreach
در استفاده از foreach باید به موارد زیر توجه داشت:
-
عدم امکان تغییر عناصر
در حلقهی foreach فقط امکان خواندن عناصر وجود دارد. اگر نیاز به تغییر یا حذف عناصر دارید، باید از حلقهی for یا روشهای دیگر استفاده کنید. -
عدم پشتیبانی از مقادیر غیرقابل شمارش
تنها مجموعههایی که از IEnumerable پیروی میکنند قابل پیمایش با foreach هستند. -
تداخل با روشهای اضافه یا حذف
اضافه یا حذف عناصر از مجموعه در حین پیمایش با foreach منجر به بروز خطا میشود.
مثال: تغییر عناصر در foreach
کد زیر نشان میدهد که تغییر مستقیم عناصر در حلقهی foreach امکانپذیر نیست:
foreach (int number in numbers)
{
number = number * 2; // خطا
}
این کد با خطا مواجه میشود زیرا foreach به شما اجازه نمیدهد که مقدار متغیر number را تغییر دهید.
راهحل: استفاده از for برای تغییر عناصر
اگر نیاز به تغییر عناصر دارید، از for استفاده کنید:
for (int i = 0; i < numbers.Length; i++)
{
numbers[i] = numbers[i] * 2;
}
این روش به شما اجازه میدهد که هر عنصر را مستقیماً تغییر دهید.
مقایسهی کارایی حلقهی foreach و for
در برخی موارد، حلقهی for میتواند کارایی بهتری نسبت به foreach داشته باشد. دلیل این امر این است که در foreach باید یک تکرارگر (Enumerator) برای پیمایش مجموعه ایجاد شود، که ممکن است کمی زمانبر باشد.
با این حال، در اکثر موارد، تفاوت کارایی میان foreach و for ناچیز است و انتخاب بین آنها بیشتر به سادگی و خوانایی کد بستگی دارد.
استفاده از foreach در آرایههای چندبعدی
برای پیمایش آرایههای چندبعدی، باید از چندین حلقهی تو در تو استفاده کنید. بهطور مثال:
int[,] matrix = new int[2, 2] { { 1, 2 }, { 3, 4 } };
foreach (int element in matrix)
{
Console.WriteLine(element);
}
در اینجا، foreach تمامی عناصر موجود در آرایهی دوبعدی را به ترتیب چاپ میکند.
حلقهی foreach در برنامهنویسی موازی
برای افزایش کارایی و سرعت، میتوان از Parallel.ForEach برای پردازش موازی مجموعهها استفاده کرد.
این نوع حلقه در پردازش دادههای حجیم و سنگین به کار میرود و از چندین هستهی پردازنده بهره میگیرد.
Parallel.ForEach(numbers, number =>
{
Console.WriteLine(number);
});
با این روش، عملیات چاپ به صورت موازی انجام میشود.
مثال کاربردی حلقهی foreach در طراحی نرم افزارهای تجاری
میخواهیم لیست شماره های موبایل کاربران را دریافت و پیامک براشون ارسال کنیم.
مرحله اول : ابتدا از جدول user ها لیست شماره موبایل رو دریافت میکنیم.
var listmobileusers=_db.Users.Select(c=>new { c.Mobile}).ToList();
مرحله دوم : یک حلقه ForEach میزنیم و یکی یکی شماره ها رو دریافت و به سمت سرویس ارسال پیامک میفرستیم.
var listmobileusers=_db.Users.Select(c=>new { c.Mobile}).ToList();
foreach(var item in listmobileusers)
{
//------سرویس ارسال پیامک
SendSmsUser.SendSms(item.Mobile);
}
دوره های مرتبط
آموزش برنامه نویسی سی شارپ
زبان شی گرایی حرفه ای سی شارپ یک زبان قدرتمند برای طراحی نرم افزار به شمار میرود.