残り僅かな全盛期

30代修行中の初心者プログラマー。いろいろなサイトを参考にコードを使用させてもらいます。

IEnumerableとIEnumerable<T>

他の人のソースを見ていて気になった。
とある自作クラスでIEnumerable<T>を継承していたが、
本当に継承する必要があるのか、と。

そのときは結果としては継承する必要が無かったわけだが、
自分自身がIEnumerable<T>をよく理解していないため、気付くのが遅かった。
というわけで、今回はIEnumerable<T>について書いてみる。

IEnumerable<T>を継承する意味とは、foreachで要素にアクセスできるようになったり、
LINQが使えるようになること。

作ったサンプルは以下。

public class MyArray<T> : IEnumerable<T>
{
    private T[] array = new T[0];

    #region コンストラクタ
    public MyArray()
    { }

    public MyArray(int count)
    {
        array = new T[count];
    }
    #endregion

    #region プロパティ
    public T this[int index]
    {
        get
        {
            return array[index];
        }
        set
        {
            array[index] = value;
        }
    }
    #endregion

    public void Add(T item)
    {
        T[] temp = new T[array.Length + 1];
        array.CopyTo(temp, 0);
        temp[temp.Length - 1] = item;
        array = temp;
    }


    #region IEnumerable<T>の実装
    public IEnumerator<T> GetEnumerator()
    {
        foreach(var item in array)
        {
            yield return item;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
    #endregion
}

GetEnumerator()とIEnumerable.GetEnumerator()を実装する必要がある。
この辺の書き方はほぼ常套句かな。

で、呼び出し側はこんなコード。

static void Main(string[] args)
{
    //10個の要素でインスタンス生成
    MyArray<int> array = new MyArray<int>(10);

    //追加
    array.Add(1);
    array.Add(4);
    array.Add(8);

    foreach (int i in array)
    {
        Console.WriteLine(i);
    }

    //要素へアクセス
    Console.WriteLine($"11番目の値は{array[11]}");
    //LINQ
    Console.WriteLine($"Count = {array.Count()}");
    Console.WriteLine($"Max = {array.Max()}");

    Console.ReadKey();
}

参考にさせていただいたブログは以下。
ありがとうございました。

yohshiy.blog.fc2.com

qiita.com