Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

การใช้ Foreach วนลูปอาร์เรย์ใน C#

ภาพรวม

คำสั่ง 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

ด้านforeachfor
Syntaxสั้น อ่านง่ายยาว ต้องจัดการ Index
ดัชนี (Index)ไม่มีโดยตรงมี (i)
แก้ไขค่าใน Arrayไม่ได้ (Read-only)ได้ (arr[i] = x)
Null ArrayNullReferenceExceptionNullReferenceException
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 ที่ Implement IEnumerable หรือ 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() ก่อน