2009-03-06 4 views

ответ

90

IEnumerable представляет собой интерфейс, который определяет один метод GetEnumerator, который возвращает интерфейс IEnumerator, в свою очередь, позволяет доступ только для чтения к коллекции. Коллекция, которая реализует IEnumerable, может использоваться с оператором foreach.

Определение

IEnumerable 

public IEnumerator GetEnumerator(); 

IEnumerator 

public object Current; 
public void Reset(); 
public bool MoveNext(); 

example code from codebetter.com

+3

@Rex M: Я думаю, что код имеет смысл. IEnumerable имеет метод GetEnumerator, который возвращает IEnumer * ator *, а не IEnumer * *. – Lernkurve

+5

@ Lernkurve ответ был изменен, чтобы быть правильным после того, как я опубликовал свой комментарий. –

6

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(); 
     } 
    } 
58

IEnumerator вещь, которая может перечислить: он имеет Current собственность и MoveNext и Reset методы (которые в коде .NET вы, вероятно, не будет вызывать явно , хотя вы могли бы).

IEnumerable - это вещь, которую можно перечислить ... это просто означает, что у нее есть метод GetEnumerator, который возвращает IEnumerator.

Что вы используете? Единственная причина использовать IEnumerator - это если у вас есть что-то, что имеет нестандартный способ перечисления (т. Е. Для возврата его отдельных элементов по одному), и вам нужно определить, как это работает. Вы должны создать новый класс, реализующий IEnumerator. Но вам все равно нужно вернуть IEnumerator в класс IEnumerable.

Для взглянуть на то, что перечислитель (реализации IEnumerator<T>) выглядит, вижу Enumerator<T> класса, такие как те, которые содержатся в List<T>, Queue<T>, или Stack<T>. Для просмотра класса, реализующего IEnumerable, см. Любой стандартный класс коллекции.

13

Enumerator показывает элементы в списке или коллекции. Каждый экземпляр Enumerator находится в определенном месте (1-й элемент, 7-й элемент и т. Д.) И может предоставить вам этот элемент (IEnumerator.Current) или перейти к следующему (IEnumerator.MoveNext). Когда вы пишете цикл foreach на C#, компилятор генерирует код, который использует Enumerator.

Enumerable - это класс, который может дать вам Enumerator s.Он имеет метод под названием GetEnumerator, который дает вам Enumerator, который смотрит на его элементы. Когда вы пишете цикл foreach на C#, код, который он генерирует, вызывает GetEnumerator для создания Enumerator, используемого в цикле.

+1

Это сообщение в блоге довольно неточно. – SLaks