Поскольку не было приведено ни одного примера, вот тот, который был мне полезен.
Перечислитель - это объект, который вы получаете, когда вызываете .GetEnumerator () для класса или типа, который реализует интерфейс IEnumerator. Когда этот интерфейс реализован, вы создали весь код, необходимый для компилятора, чтобы вы могли использовать 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