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?