Какие основные свойства и методы у IEnumerable?
У интерфейса IEnumerable фактически один основной член — метод GetEnumerator(), который возвращает перечислитель для обхода коллекции. Свойства вроде Current, а также методы MoveNext() и Reset() принадлежат интерфейсу IEnumerator, а не самому IEnumerable. В обыденной речи их часто упоминают вместе, потому что foreach использует связку IEnumerable + IEnumerator для перебора.
IEnumerable (и его обобщённая версия IEnumerable<T>) определяет способность объекта предоставлять последовательность элементов, по которой можно пройтись с помощью foreach или LINQ.
Важно не путать два интерфейса:
IEnumerable/IEnumerable<T> — "коллекция, которую можно перечислить"; содержит один метод GetEnumerator(), который возвращает объект-перечислитель.IEnumerator/IEnumerator<T> — сам перечислитель; именно он содержит свойство Current и методы MoveNext() и Reset().То есть у IEnumerable и IEnumerable<T> нет свойства Current; есть только метод GetEnumerator():
IEnumerable:
IEnumerator GetEnumerator();
IEnumerable<T>:
IEnumerator<T> GetEnumerator();
Компилятор, видя цикл foreach, разворачивает его в вызов GetEnumerator() у объекта, затем вызывает у полученного перечислителя MoveNext() и читает элемент через Current.
Именно наличие метода GetEnumerator() делает объект совместимым с foreach и позволяет использовать над ним LINQ-операторы (они реализованы как методы-расширения для IEnumerable/IEnumerable<T>). В типичном коде коллекции (List<T>, Array и т.п.) реализуют IEnumerable<T>, предоставляя реализацию GetEnumerator(), а все остальные операции перечисления происходят уже через соответствующий IEnumerator<T>.
Отметьте свой прогресс