ทั้ง IEnumerable และ IEnumerator เป็นอินเทอร์เฟซสำหรับการวนลูป (Iteration) ใน C# แต่มีบทบาทที่ต่างกัน
IEnumerable (Container)
- แทนคอลเลกชันที่ "สามารถวนลูปได้"
- มีเมธอดเดียว:
GetEnumerator()ส่งคืนIEnumerator - ใช้กับ
foreachได้โดยตรง - Read-only access เท่านั้น
IEnumerator (Cursor/Iterator)
- แทน "Cursor" ที่ชี้ไปที่องค์ประกอบปัจจุบัน
- มี 2 เมธอด + 1 คุณสมบัติ:
MoveNext()- เลื่อนไปข้างหน้า ส่งคืน true/falseReset()- รีเซ็ตกลับจุดเริ่มต้น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/UnboxingIEnumerator<T>- มีCurrentเป็น T โดยตรงIEnumerable<T>สืบทอดมาจากIEnumerable(Non-generic)
สรุป: IEnumerable = "สิ่งที่วนลูปได้" | IEnumerator = "ตัวควบคุมการวนลูป"