例が示されていなかったので、これが私にとって役に立ちました。
列挙子は、IEnumerator インターフェイスを実装するクラスまたは型で .GetEnumerator() を呼び出すときに取得するオブジェクトです。foreach
このインターフェースが実装されると、コンパイラーがコレクションを「反復」できるようにするために必要なすべてのコードが作成されます。
ただし、「反復」という言葉を反復子と混同しないでください。列挙子と反復子の両方で「反復」できます。列挙と反復は基本的に同じプロセスですが、実装方法が異なります。列挙とは、IEnumerator インターフェイスを実装したことを意味します。反復とは、クラスで反復子構造を作成し (以下に示す)、foreach
クラスを呼び出していることを意味し、その時点で、コンパイラは列挙子機能を自動的に作成します。
また、列挙子でしゃがむ必要がないことに注意してください。一日中電話MyClass.GetEnumerator()
しても何もしなくても構いません (例:
IEnumerator myEnumeratorThatIWillDoNothingWith = MyClass.GetEnumerator()
)。
クラス内の反復子構造は、実際に使用している場合、つまりクラスを呼び出した場合にのみ実際に使用されることに注意してforeach
ください。
msdnの反復子の例を次に示します。
public class DaysOfTheWeek : System.Collections.IEnumerable
{
string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };
//This is the iterator!!!
public System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < days.Length; i++)
{
yield return days[i];
}
}
}
class TestDaysOfTheWeek
{
static void Main()
{
// Create an instance of the collection class
DaysOfTheWeek week = new DaysOfTheWeek();
// Iterate with foreach - this is using the iterator!!! When the compiler
//detects your iterator, it will automatically generate the Current,
//MoveNext and Dispose methods of the IEnumerator or IEnumerator<T> interface
foreach (string day in week)
{
System.Console.Write(day + " ");
}
}
}
// Output: Sun Mon Tue Wed Thr Fri Sat