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