C#反復器

12811 ワード

IEnumerator
IEnumeratorインタフェースを実装するクラスこそ、各要素が循環的にアクセスされる論理を定義する真の反復器です.
//    IEnumerator
public class WeekEnumerator : IEnumerator
{
    string[] week = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
    int position = -1;

    public object Current => week[position];

    public bool MoveNext()
    {
        position++;
        return position < week.Length;
    }

    public void Reset()
    {
        position = -1;
    }
}

//      
var week = new WeekEnumerator ();
while (week .MoveNext())
{
	Debug.Log(week.Current);
}

yield return
yieldは文法糖で、IEnumeratorインタフェースのCurrent、MoveNextなどを自動的に実現します.MonthEnumeratorがしたことを完了します.したがって、yieldキーワードを使用した文のメソッド、演算子、getアクセサも反復器です.
複数のyield文を使用すると、IEnumeratorの煩雑な操作を手動で実現する代わりに使用できます.
//        
IEnumerator GetWeek()
{
	//    yield              IEnumerator     (    WeekEnumerator )
	// yield return        IEnumerator
	yield return "Mon";
	yield return "Tue";
	yield return "Wed";
	yield return "Thu";
	yield return "Fri";
	yield return "Sat";
	yield return "Sun";
}

//          
var week = GetWeek();
while (week.MoveNext())
{
	Debug.Log(week.Current);
}

IEnumerable
IEnumerableインタフェースは、実際にはループアクセスを簡素化し、foreachを介してループするためにIEnumeratorをパッケージ化しています.
// IEnumerable          IEnumerator    
public interface IEnumerable
{
	IEnumerator GetEnumerator();
}

//    foreach    List,      IEnumerable      
var array = new List<int> { 100, 101, 102 };
foreach (var item in array)
{
	Debug.Log(item);
}

//            foreach   
var enumerator = array.GetEnumerator();
while (enumerator.MoveNext())
{
	Debug.Log(enumerator.Current);
}

すなわち、IEnumeratorクラスは、IEnumerableインタフェースパッケージを使用した後、foreachループを使用することができ、そうでなければMoveNextを使用して手動で完了する必要がある.C#には集合が付属しており、一般的にはIEnumerableインタフェースから実現され、foreachで反復することができます.
IEnumerableとIEnumeratorを使用したカスタムコレクション
//    IEnumerable   
public class Week : IEnumerable
{
	//      IEnumerator
    public IEnumerator GetEnumerator()
    {
        return new WeekEnumerator();
    }
}

//    IEnumerator   
public class WeekEnumerator : IEnumerator
{
	//          
    ...
}

yieldはIEnumeratorタイプの生成に役立つため、yieldを使用してカスタムセットの定義を簡略化できます.
//       IEnumerable   ,   yield       IEnumerator
public class Week : IEnumerable
{
    string[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

    public IEnumerator GetEnumerator()
    {
        for (int i = 0; i < days.Length; i++)
        {
            yield return days[i];
        }
    }
}