|  |  | 
 
| 連載:[完全版]究極のC#プログラミングChapter3 新しい繰り返しのスタイル ― yield return文とForEachメソッド川俣 晶2009/08/31
 |  | 
| 
 | 
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 記事ランキング
		
		
			本日
			月間