How does IEnumerable<T>.Reverse work?

.net, c#, collections, linq

Solution

In short, it buffers everything and then walks through it backwards. Not efficient, but then, neither is OrderBy from that perspective.

In LINQ-to-Objects, there are buffering operations (Reverse, OrderBy, GroupBy, etc) and non-buffering operations (Where, Take, Skip, etc).

As an example of a non-buffering `Reverse` implementation using `IList<T>`, consider:

public static IEnumerable<T> Reverse<T>(this IList<T> list) {
    for (int i = list.Count - 1; i >= 0; i--) {
        yield return list[i];
    }
}

Note that this is still a little susceptible to bugs if you mutate the list while iterating it... so don't do that ;-p

Problem

I am checking out the code in the reflector, but I haven't yet found out how it can enumerate through a collection backwards? Since there is no count information, and enumeration always starts from the "start" of the collection, right? Is it a drawback in the .NET framework? Is the cost higher than regular enumeration?

Original source

Related problems