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()でしょう。