In C# we use the iterator pattern to iterate over collections like Dictionary, Queue, ArrayList, List and so on. This collections all implement the IEnumerable interface. For many cases this is a much more convenient way to group objects then using regular arrays.
When you only want to iterate over a subset of a collection, you may use linq to objects to query it, or helper methods that return an IEnumerable instance that contain only the object subset.
If a method returns an IEnumerable, it can return multiple objects by using the yield return statement.
Lets’s look at an Example:
The second example returns a filtered List of objects:
And yes, the same result can be archived with an simple linq statement:
.Where( person => person.Age >= 18 )
.ForEach( person => Console.WriteLine(person) );
If you’re interested how the C# compiler handles this, have a look at John Skeet’s article “Iterator block implementation details: auto-generated state machines“.