Well, foreach can be done on any type of collection, ordered, sorted, or non-ordered.
In C# 2.0 multiple iterators are supported, for instance look at this example:
http://msdn2.microsoft.com/en-US/library/ee5kxzk0.aspx
In C# 1.1 a class can have only one iterator that can be used by the for each statement, somethin like the reversor can be used (I too liked it). An alternative that I have used for some collections is to create inner classes with the sole purpose of providing alternate iterators. A 3rd solution is to implement your own iterators and use them the classic way in a while loop. In most cases though I use boudino's first solution.