IEnumerable<T> の実装

コレクションクラスでIEnumerable<T> インタフェースを実装する場合の覚え書き。


実装するメソッドは、以下の 2 つ。

  1. IEnumerator<T> GetEnumerator()
  2. IEnumerator GetEnumerator()

"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();
    }

参考: