When should I use Yield Return?

Firstly we need to understand what yield return does.


The yield keyword returns elements from a collection without the need for a temporary collection.


Temporary Collection


Previously you would have done something similar to this.

  • Create a temporary list of dogs
  • Iterate through your list of pets
  • Evaluate whether the pet is a dog. If true, add it to the list of dogs
  • Once all pets have been checked, return the list of dogs to the calling method
public static IEnumerable GetDogs(IEnumerable pets){
    List dogs = new List();
    foreach (var pet in pets)
    return dogs;

As you can imagine this can be very inefficient, especially if you have a large list of pets, where only a handful are dogs. Your code would still have to evaluate every pet.

In the code below, we want to grab 2 dogs from a list of pets.  That sounds simple enough, but as you can see our code has to process every pet to decide whether it is a dog or not.


Yield Return


Yield return on the other hand can

  • Iterate through your collection of pets 1 at a time
  • Evaluate whether the pet is a dog. 
  • If it is, it will yield control back to the calling method whilst remembering it's position in the iteration.
  • Once it has reached our request of finding 2 dogs, it will hand back control to the calling method without having to check the remaining pets.  Drastically improving performance.


Here is an example showing this.



I hope this has made it a little easier to understand.