C#反復器
12811 ワード
IEnumerator
IEnumeratorインタフェースを実装するクラスこそ、各要素が循環的にアクセスされる論理を定義する真の反復器です.
yield return
yieldは文法糖で、IEnumeratorインタフェースのCurrent、MoveNextなどを自動的に実現します.MonthEnumeratorがしたことを完了します.したがって、yieldキーワードを使用した文のメソッド、演算子、getアクセサも反復器です.
複数のyield文を使用すると、IEnumeratorの煩雑な操作を手動で実現する代わりに使用できます.
IEnumerable
IEnumerableインタフェースは、実際にはループアクセスを簡素化し、foreachを介してループするためにIEnumeratorをパッケージ化しています.
すなわち、IEnumeratorクラスは、IEnumerableインタフェースパッケージを使用した後、foreachループを使用することができ、そうでなければMoveNextを使用して手動で完了する必要がある.C#には集合が付属しており、一般的にはIEnumerableインタフェースから実現され、foreachで反復することができます.
IEnumerableとIEnumeratorを使用したカスタムコレクション
yieldはIEnumeratorタイプの生成に役立つため、yieldを使用してカスタムセットの定義を簡略化できます.
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];
}
}
}