[ACCEPTED]-How does IEnumerable<T>.Reverse work?-collections
In short, it buffers everything and then 10 walks through it backwards. Not efficient, but 9 then, neither is OrderBy from that perspective.
In 8 LINQ-to-Objects, there are buffering operations 7 (Reverse, OrderBy, GroupBy, etc) and non-buffering 6 operations (Where, Take, Skip, etc).
As an 5 example of a non-buffering Reverse
implementation 4 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 3 a little susceptible to bugs if you mutate 2 the list while iterating it... so don't 1 do that ;-p
It works by copying the underlying IEnumerable<T> to 7 an array, then enumerating over that array 6 backward. If the underlying IEnumerable<T> implements ICollection<T> (like T[], List<T>, etc.), then the copy step is skipped and the enumerator just iterates over the underlying collection directly.
For more information, check out 5 System.Linq.Buffer<TElement> in Reflector.
Edit: The 4 underlying collection is always copied, even 3 if it's an ICollection<TElement>. This 2 prevents changes in the underlying collection 1 from being propagated by the Buffer<TElement>.
it loads all items to memory and then steps 2 through them (backwards). this is far less 1 efficient.
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.