Roadmap › C# Language — Basics to Advanced › Module: Asynchronous and Parallel Programming
Lessons in this course (38)

36. IEnumerable, yield and async streams

AdvancedMediumLesson 36 of 38
csharp
IEnumerable<int> Evens(int max)
{
    for (int i = 0; i <= max; i += 2)
        yield return i;          // lazy: produced one at a time when iterated
}

async IAsyncEnumerable<Order> ReadOrdersAsync([EnumeratorCancellation] CancellationToken ct = default)
{
    await foreach (var row in db.StreamAsync(ct))
        yield return Map(row);
}

await foreach (var o in ReadOrdersAsync()) Console.WriteLine(o.Id);

Deferred execution: nothing runs until you enumerate (foreach, ToList(), Count()). Enumerating twice runs the work twice.