The basic range uses the interface function front, popfront, empty three functions, as long as the implementation of these three functions, is a range. Using these three functions to access the element represents an ordered collection, so it can be called a sequence set, which is a queue-style operation.
In C #, ienumreable only requires access to elements, and there is no ordered requirement, which is the same as the Opapply interface in C #.
In the D language there are two iterations, one is to implement front, Popfront, empty these three interfaces, the other is to implement the Opapply interface, as long as one can be implemented using foreach iterative access.
Note that only objects that implement the Opapply interface can be accessed using foreach, and he is not a range.
In Inputrange, it is more stringent, need to implement the above two interfaces is a inputrange.
The difference between range in D and ienumreable in C #