|
|
連載:[完全版]究極のC#プログラミング
Chapter3 新しい繰り返しのスタイル ― yield return文とForEachメソッド
川俣 晶
2009/08/31 |
![](/fdotnet/extremecs/index/extremecs_m.jpg) |
|
3.7 1つのクラスに複数の列挙機能を付ける
クラスライブラリのDictionaryクラス(System.Collections.Generic名前空間)はそれ自身が列挙可能であると同時に、列挙可能なKeysプロパティやValuesプロパティを持っている。こういったクラスを反復子で実装するのも簡単である。
リスト3.6は、配列をそのままの順番で列挙するGetEnumeratorメソッドと、逆順で列挙するGetReverseOrderメソッドを提供するクラスの例である。
using System;
using System.Collections.Generic;
class Sample
{
private int[] array = { 1, 2, 3 };
public IEnumerator<int> GetEnumerator()
{
for (int i = 0; i < array.Length; i++)
{
yield return i;
}
}
public IEnumerable<int> GetReverseOrder()
{
for (int i = array.Length - 1; i >= 0 ; i--)
{
yield return i;
}
}
}
class Program
{
static void Main(string[] args)
{
foreach (int i in new Sample())
{
Console.WriteLine(i);
}
// 出力:
// 0
// 1
// 2
foreach (int i in new Sample().GetReverseOrder())
{
Console.WriteLine(i);
}
// 出力:
// 2
// 1
// 0
}
}
|
|
リスト3.6 反復子で複数の列挙機能を持つクラスを作る |
ここでは、GetEnumeratorメソッドはforeach文内で明示的に書く必要はないが、GetReverseOrderメソッドは明示的に名前を書く必要があることに留意しよう。
また、このリスト3.6には、1つだけ注意点がある。それは、GetEnumeratorメソッドの戻り値の型はIEnumerator<int>型であるのに対して、GetReverseOrderメソッドはIEnumerable<int>型になっているという点である。
GetEnumeratorメソッドとGetReverseOrderメソッドは、ソースコードだけ見ているとよく似た兄弟に見えるが、foreach文から見ると扱いがまったく別個なのである。foreach文は通常、IEnumerable<T>型のオブジェクトを受け取って処理するが、特定の型を返すGetEnumeratorという名前のpublicなメソッドは、それだけで列挙可能と見なされるのである。
Insider.NET 記事ランキング
本日
月間