If you are on .NET 3.5 you can do this:
IEnumerable<int> enumerableThing = ...;
foreach (var x in enumerableThing.Reverse())
It isn't very efficient as it has to basically go through the enumerator forwards putting everything on a stack then pops everything back out in reverse order.
If you have a directly-indexable collection (e.g. IList) you should definitely use a for
loop instead.
If you are on .NET 2.0 and cannot use a for loop (i.e. you just have an IEnumerable) then you will just have to write your own Reverse function. This should work:
static IEnumerable<T> Reverse<T>(IEnumerable<T> input)
{
return new Stack<T>(input);
}
This relies on some behaviour which is perhaps not that obvious. When you pass in an IEnumerable to the stack constructor it will iterate through it and push the items onto the stack. When you then iterate through the stack it pops things back out in reverse order.
This and the .NET 3.5 Reverse()
extension method will obviously blow up if you feed it an IEnumerable which never stops returning items.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…