IEnumerable довольно прост:
[ComVisibleAttribute(True)]
[GuidAttribute("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
А для полноты IEnumerator
[ComVisibleAttribute(true)]
[GuidAttribute("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerator
{
Object Current {get;}
bool MoveNext();
void Reset();
}
Но чаще всего выв примерах кода действительно IEnumerable
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
IEnumerator GetEnumerator(); //inherited from IEnumerable
}
И снова для полноты IEnumerator (с IDisposable ):
public interface IEnumerator<out T> : IDisposable, IEnumerator
{
void Dispose(); //inherited from IDsiposable
Object Current {get;} //inherited from IEnumerator
T Current {get;}
bool MoveNext(); //inherited from IEnumerator
void Reset(); //inherited from IEnumerator
}
[ComVisibleAttribute(true)]
public interface IDisposable
{
void Dispose();
}
Вот и все, что нужно сделать.Нет прямого кода реализации для всего этого, специфичного для IEnumerable или соответствующего кода, показанного здесь.Скорее, такие типы, как массивы или List будут наследоваться от IEnumerable и реализовывать необходимые методы.Все остальное, кроме этого, делается с помощью методов расширения .
. Что делает его еще более мощным, так это следующие элементы:
- C # *
foreach
поддерживает зацикливание что-нибудь , которое имеет метод GetEnumerator()
, который возвращает IEnumerator, и поэтому вы можете использовать любой тип, который реализует IEnumerable с циклом foreach. - Синтаксис понимания запросов linq работает аналогичным образом, такой, что вы можете использовать практически любой IEnumerable с linq для объектов.
- Ключевое слово
yield
позволяет вам создать нечто, называемое итераторными блоками .Блоки итераторов имеют некоторые аккуратные свойства (например, ленивая оценка) и позволяют легко создавать собственные типы IEnumerable без необходимости сначала определять новый класс.
Наконец, стоит отметитьздесь IDisposable - еще один интерфейс, заслуживающий дальнейшего изучения, так как он довольно часто используется в фреймворке и имеет прямую языковую поддержку, аналогичную IEnumerable foreach
с ключевым словом using
.