IEnumerable<T> の実装
コレクションクラスでIEnumerable<T> インタフェースを実装する場合の覚え書き。
実装するメソッドは、以下の 2 つ。
"IEnumerator<T> GetEnumerator()" の実装は、以下のようにする。
- コレクションクラスの実装にList<T>などの IEnumerable<T> を実装するオブジェクトを使う場合は、そのオブジェクトの GetEnumerator() をそのまま使う。
private List<T> m_list; public IEnumerator<T> GetEnumerator() { // IEnumerator<T> を返す GetEnumerator() があれば、それを呼ぶ。 return m_list.GetEnumerator(); }
- コレクションクラスの実装に配列を使う場合、配列は IEnumerator を返す GetEnumerator() はあるが、IEnumerator<T> を返すものはない。そのため、Linq の Cast() を使って IEnumerable<T> のオブジェクトを取得し、そのオブジェクトの GetEnumerator() を呼ぶ。
using System.Linq; private T[] m_array; public IEnumerator<T> GetEnumerator() { // Linq の Cast() で IEnumerable<T> のオブジェクトを取得する。 return m_array.Cast<T>().GetEnumerator(); }
- IEnumerator<T> のオブジェクトが利用できない場合は、イテレータを使う。
"IEnumerator GetEnumerator()" の実装は、"IEnumerator<T> GetEnumerator()" を呼ぶ。
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
参考: