IEnumerable <T> vs IReadOnlyList <T>
IEnumerable<T> is a direct pointer to some data. You can go from beginning to end of a collection by looking at one item at a time.
IReadOnlyList<T> is a readable random access collection.
IEnumerable<T> more general because it can represent elements created on the fly, data coming in over the network, rows from the database, etc. IReadOnlyList<T> , on the other hand, basically represents only collections in memory.
If you only need to look at each element once, in order, then IEnumerable<T> is the best choice - it is more general.
I would recommend actually looking at the standard C ++ template library - their discussion of the various types of iterators really reflects your question well.