IEnumerable<T>
представляет собой однонаправленный курсор над некоторыми данными. Вы можете перейти от начала до конца коллекции, глядя на один элемент за раз.
IReadOnlyList<T>
представляет собой читаемую коллекцию случайного доступа.
IEnumerable<T>
более общий, поскольку он может представлять элементы, созданные на лету, данные, поступающие по сети, строки из базы данных и т. Д. IReadOnlyList<T>
, с другой стороны, в основном представляет только коллекции в памяти.
Если вам нужно только посмотреть на каждый пункт один раз, в порядке, то IEnumerable<T>
- лучший выбор - это более общий.
Я бы рекомендовал на самом деле взглянуть на стандартную библиотеку шаблонов C++ - их обсуждение различных типов итераторов на самом деле очень хорошо отображает ваш вопрос.