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(); }
参考にさせていただいたブログは以下。
ありがとうございました。