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

IEnumerable vs IEnumerator ใน C#: ความแตกต่าง

ทั้ง IEnumerable และ IEnumerator เป็นอินเทอร์เฟซสำหรับการวนลูป (Iteration) ใน C# แต่มีบทบาทที่ต่างกัน

IEnumerable (Container)

  • แทนคอลเลกชันที่ "สามารถวนลูปได้"
  • มีเมธอดเดียว: GetEnumerator() ส่งคืน IEnumerator
  • ใช้กับ foreach ได้โดยตรง
  • Read-only access เท่านั้น

IEnumerator (Cursor/Iterator)

  • แทน "Cursor" ที่ชี้ไปที่องค์ประกอบปัจจุบัน
  • มี 2 เมธอด + 1 คุณสมบัติ:
    • MoveNext() - เลื่อนไปข้างหน้า ส่งคืน true/false
    • Reset() - รีเซ็ตกลับจุดเริ่มต้น
    • Current - ดึงค่าปัจจุบัน
  • ควบคุมการวนลูปได้ละเอียดกว่า foreach

ความสัมพันธ์

IEnumerable → GetEnumerator() → IEnumerator → MoveNext()/Current

ตัวอย่าง Implement ทั้งคู่

class Demo : IEnumerable, IEnumerator
{
    private int[] data = { 1, 2, 3 };
    private int index = -1;
    
    // IEnumerable
    public IEnumerator GetEnumerator()
    {
        index = -1; // Reset สำหรับ Enumerator ใหม่
        return this;
    }
    
    // IEnumerator
    public object Current => data[index];
    
    public bool MoveNext()
    {
        index++;
        return index < data.Length;
    }
    
    public void Reset()
    {
        index = -1;
    }
}

การใช้งาน

Demo d = new Demo();

// ใช้ foreach (ใช้ IEnumerable)
foreach (var item in d) Console.WriteLine(item);

// ใช้ IEnumerator โดยตรง
var enumerator = d.GetEnumerator();
while (enumerator.MoveNext())
{
    Console.WriteLine(enumerator.Current);
}

Generic Versions (แนะนำ)

  • IEnumerable<T> - Type-safe, ไม่ต้อง Boxing/Unboxing
  • IEnumerator<T> - มี Current เป็น T โดยตรง
  • IEnumerable<T> สืบทอดมาจาก IEnumerable (Non-generic)

สรุป: IEnumerable = "สิ่งที่วนลูปได้" | IEnumerator = "ตัวควบคุมการวนลูป"