イテレーター
イテレーターとは反復子ともいわれ、集合の個々の要素に対して繰り返し処理を行うためのものです。C#言語においては、主にforeachで使われるためのものであり、以下のように定義されます。
戻りの型は以下の4つのうちのいずれかのインタフェースとなる。
・System.Collections.IEnumerable
・System.Collections.IEnumerator
・System.Collections.Generic.IEnumerable
・System.Collections.Generic.IEnumerator
各要素を返却するにはyield returnを用いる
メソッドかGetterプロパティ、またはクラスとして実装される。
    public class Program
    {
        public void Test()
        {
            // メソッド
            foreach (var str in GetDayOfWeekNames())
                Console.WriteLine(str);
            GetDayOfWeekNames().ToList().ForEach(str => Console.WriteLine(str));
            // プロパティ
            foreach (var str in DayOfWeekNames)
                Console.WriteLine(str);
            DayOfWeekNames.ToList().ForEach(str => Console.WriteLine(str));
            // クラス
            var weekNames = new DayOfWeekNameCollection();
            foreach(var str in weekNames)
                Console.WriteLine(str);
            weekNames.ToList().ForEach(str => Console.WriteLine(str));
        }
        // イテレータメソッド
        IEnumerable<string> GetDayOfWeekNames()
        {
            var array = Enum.GetValues(typeof(DayOfWeek));
            for (int n = 0; n < array.Length; n++)
                yield return array.GetValue(n).ToString();
            
        }
        // イテレータプロパティ
        IEnumerable<string> DayOfWeekNames
        {
            get
            {
                var array = Enum.GetValues(typeof(DayOfWeek));
                for (int n = 0; n < array.Length; n++)
                    yield return array.GetValue(n).ToString();
            }
        }
    }
    // イテレータクラス
    public class DayOfWeekNameCollection : IEnumerable<string>
    {
        public IEnumerator<string> GetEnumerator()
        {
            var array = Enum.GetValues(typeof(DayOfWeek));
            for (int n = 0; n < array.Length; n++)
                yield return array.GetValue(n).ToString();
        }
        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    }
イテレータに関係するインタフェース
System.Collections.IEnumeratorメンバは以下の3つが定義されています
 
 object Current { get; }
bool MoveNext ();
void Reset ();
bool MoveNext ();
void Reset ();
現在の値と、次の値へ移動するのと、最初に戻る3つですね。一方向への逐次処理であることがよくわかります。
System.Collections.IEnumerable
これはメンバが一つだけ定義されています
 IEnumerator GetEnumerator();
反復処理の実処理側を担うIEnumeratorインタフェースが戻り型だけとなります。ジェネリクスの方は金本的にはこれらと同じです。たとえばIEnumerable
 
 IEnumerable : IEnumerable
{
new IEnumerator GetEnumerator();
}  
      {
new IEnumerator
}

  
  
  
  
