C#の構文で foreach は、非常に便利な機能です。
foreach機能を作成するには、IEnumerableやIEnumeratorインターフェースを実装する必要があり、結構面倒です。
そこでC# 2.0ではイテレーター構文というものが追加されています。
ブロック中にyield returnもしくはyield breakを書くことで、通常のメソッドやプロパティとは違った動作になります。
イテレーター基本的動作の確認
static public IEnumerable<int> LoopTo(int st, int ed) { while (st <= ed) { yield return st++; } } private void button1_Click(object sender, EventArgs e) { int v = 0; foreach (int i in LoopTo(10, 20)) { v += i; } }
上記をデバッガーでトレースしてみれば分かると思いますが、yieldにより特別な動きを実現しています。
foreachの機能実装(イテレーター)
class LoopTo { int st, ed; public LoopTo(int st, int ed) { this.st = st; this.ed = ed; } public IEnumerable<int> Enumerable { get { while (st <= ed) yield return st++; } } public IEnumerator<int> GetEnumerator() { while (st <= ed) yield return st++; } } private void button1_Click(object sender, EventArgs e) { LoopTo lt1 = new LoopTo(1, 10); int v = 0; foreach (int i in lt1.Enumerable) { v += i; } LoopTo lt2 = new LoopTo(1, 10); v = 0; foreach (int i in lt2) { v += i; } }
Enumerable、とGetEnumerator()は同じことができます。通常GetEnumerator()でしょう。