Возможный дубликат:
Может ли кто-нибудь объяснить IEnumerable и IEnumerator мне?
В чем разница между IEnumerator и IEnumerable?
Возможный дубликат:
Может ли кто-нибудь объяснить IEnumerable и IEnumerator мне?
В чем разница между IEnumerator и IEnumerable?
IEnumerable - это интерфейс, который определяет один метод GetEnumerator, который возвращает IEnumerator, что, в свою очередь, позволяет читать только доступ к коллекции. Коллекция, которая реализует IEnumerable, может использоваться с оператором foreach.
Определение
IEnumerable
public IEnumerator GetEnumerator();
IEnumerator
public object Current;
public void Reset();
public bool MoveNext();
An IEnumerator - это вещь, которая может перечислять: она имеет свойство Current и методы MoveNext и Reset (которые в .NET-коде вы, вероятно, не будете явно вызывать, хотя могли бы).
An IEnumerable - это вещь, которую можно перечислить... это просто означает, что у нее есть метод GetEnumerator, который возвращает IEnumerator.
Что вы используете? Единственная причина использования IEnumerator заключается в том, что у вас есть что-то, что имеет нестандартный способ перечисления (т.е. Возврата его отдельных элементов один за другим), и вам нужно определить, как это работает. Вы создадите новый класс, реализующий IEnumerator. Но вам все равно нужно вернуть этот IEnumerator в класс IEnumerable.
Посмотрите, как выглядит счетчик (реализация IEnumerator<T>), см. любой класс Enumerator<T>, такой как те, что содержатся в List<T>, Queue<T>, или Stack<T>. Для просмотра класса, реализующего IEnumerable, см. Любой стандартный класс коллекции.
An Enumerator показывает элементы в списке или коллекции.
Каждый экземпляр Enumerator находится в определенной позиции (1-й элемент, 7-й элемент и т.д.) И может предоставить вам этот элемент (IEnumerator.Current) или перейти к следующему (IEnumerator.MoveNext). Когда вы пишете цикл foreach в С#, компилятор генерирует код, который использует Enumerator.
An Enumerable - это класс, который может дать вам Enumerator s. Он имеет метод под названием GetEnumerator, который дает вам Enumerator, который смотрит на его элементы. Когда вы пишете цикл foreach в С#, код, который он генерирует, вызывает GetEnumerator, чтобы создать Enumerator, используемый циклом.
IEnumerable и IEnumerator оба являются интерфейсами. IEnumerable имеет только один метод с именем GetEnumerator. Этот метод возвращает (так как все методы возвращают что-то, включая void) другой тип, который является интерфейсом, а этот интерфейс - IEnumerator. Когда вы реализуете логику перечислителя в любом классе вашей коллекции, вы реализуете IEnumerable (либо универсальный, либо не универсальный). IEnumerable имеет только один метод, тогда как IEnumerator имеет 2 метода (MoveNext и Reset) и свойство Current. Для простоты понимания рассмотрим IEnumerable как блок, в котором находится IEnumerator (но не через наследование или ограничение). Смотрите код для лучшего понимания:
class Test : IEnumerable, IEnumerator
{
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
public object Current
{
get { throw new NotImplementedException(); }
}
public bool MoveNext()
{
throw new NotImplementedException();
}
public void Reset()
{
throw new NotImplementedException();
}
}