Возможный дубликат:
Может ли кто-нибудь объяснить 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();
}
}