ภาพรวม
คำสั่ง foreach ใช้วนลูปทำงานสำหรับแต่ละองค์ประกอบในอาร์เรย์หรือ Collection คล้าย for แต่ ไม่มีดัชนี (Index) และ ไม่สามารถแก้ไขค่า Iteration Variable ได้ (Read-only)
ตัวอย่าง: Bubble Sort + Foreach แสดงผล
using System;
namespace BubbleSort
{
class MySort
{
static void Main(string[] args)
{
int[] arr = { 78, 55, 45, 98, 13 };
int temp;
// Bubble Sort
for (int j = 0; j <= arr.Length - 2; j++)
{
for (int i = 0; i <= arr.Length - 2; i++)
{
if (arr[i] > arr[i + 1])
{
temp = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = temp;
}
}
}
// แสดงผลด้วย Foreach
Console.WriteLine("Sorted:");
foreach (int p in arr)
Console.Write(p + " ");
Console.Read();
}
}
}ผลลัพธ์
Sorted: 13 45 55 78 98
คำอธิบาย
1. Bubble Sort (จัดเรียง)
for (int j = 0; j <= arr.Length - 2; j++)
for (int i = 0; i <= arr.Length - 2; i++)
if (arr[i] > arr[i + 1])
Swap(arr[i], arr[i + 1]);เปรียบเทียบคู่ติดกัน สลับถ้าผิดลำดับ ทำซ้ำ n-1 รอบ
2. Foreach แสดงผล
foreach (int p in arr)
Console.Write(p + " ");p รับค่าของแต่ละองค์ประกอบตามลำดับ (13, 45, 55, 78, 98) ไม่ต้องใช้ดัชนี
Foreach vs For Loop
| ด้าน | foreach | for |
|---|---|---|
| Syntax | สั้น อ่านง่าย | ยาว ต้องจัดการ Index |
| ดัชนี (Index) | ไม่มีโดยตรง | มี (i) |
| แก้ไขค่าใน Array | ไม่ได้ (Read-only) | ได้ (arr[i] = x) |
| Null Array | NullReferenceException | NullReferenceException |
| Performance (Array) | เท่า for (Compiler Optimize) | Baseline |
การได้ Index ใน Foreach (C# 7.0+)
// ใช้ LINQ Select
foreach (var (index, value) in arr.Select((v, i) => (i, v)))
{
Console.WriteLine($"[{index}] = {value}");
}
// หรือเขียน Helper Method
public static IEnumerable<(int Index, T Value)> WithIndex(this IEnumerable source)
{
int i = 0;
foreach (var item in source)
yield return (i++, item);
}
// ใช้งาน
foreach (var (i, v) in arr.WithIndex())
Console.WriteLine($"{i}: {v}"); ข้อสังเกตสำคัญ
foreachใช้กับทุก Type ที่ ImplementIEnumerableหรือIEnumerable<T>(Array, List, Dictionary, Custom Collection)- Iteration Variable เป็น Read-only -
p = 10;จะ Compile Error - สำหรับ Value Type (int, struct) -
pเป็น Copy การแก้ไขไม่ส่งผลต่อ Array - สำหรับ Reference Type -
p.Property = xส่งผลต่อ Object จริง (แต่p = new Obj()ไม่ได้) - หลีกเลี่ยงการ Modify Collection ขณะ Foreach (InvalidOperationException) - ใช้
forหรือToList()ก่อน