The 2.0 compiler writes all the complex iterating type stuff for you these days so you don't have to get heavy with state machines and what not.
This kind of simplicity means that iterators can be used wherever a method returns a collection of stuff, for example GetPassengers(Train) could whizz through and return all the passengers in one go, or it could return them one at a time as it finds them to the calling for loop -- this might be useful if they're still getting on the train, as it were. And taking it further, what if the Train was actually a serial port and the people were data, hmm?
This article explains everything thoroughly.
http://msdn.microsoft.com/en-us/magazine/cc163682.aspx