Skip to main content

Understanding yield return in C#

What It Does

yield return is a lazy evaluation iterator that returns values one at a time instead of creating and returning an entire collection at once.

yield return number;

This line pauses execution and returns the current number value to the caller. The next time the caller requests another value (like in a foreach loop), the method resumes execution right after the yield return statement and continues the loop.

Example:

private static IEnumerable<int> Filter(IEnumerable<int> numbers) {
foreach (var number in numbers)
{
if (number % 2 == 0)
{
yield return number; // Returns the even number and pauses execution
}
}
}

How It Works

  • First iteration: Loop starts, finds first even number (2) → yield return 2 → method pauses
  • Second iteration: Caller requests next value → method resumes → loop continues, finds next even number (4) → yield return 4 → method pauses
  • This continues until no more even numbers exist

Memory Efficiency

Without yield return (the commented version):

var result = new List<int>(); // Creates list in memory immediately
foreach (var number in numbers) {
if (number % 2 == 0) {
result.Add(number); // Stores ALL even numbers at once
}
}
return result; // Returns complete list

❌ Requires storing all even numbers in memory upfront

With yield return (current version):

yield return number; // Returns one even number at a time, no need to store all in memory

✅ Only keeps current value in memory—memory efficient for large datasets

Key Difference

Your method returns IEnumerable<int> (iterator), not List<int>. This makes it a generator that produces values on-demand, similar to how LINQ methods work.