I just started using a neat trick in C# when working with iterators: the yield keyword. This lets you easily return items as an IEnumerable without having to worry about state.

It looks like this:

using System;
using System.Collections.Generic;
using System.Text;

namespace WorkingWithYield
{
 class Program
 {
     static IEnumerable<string> GetIDs()
     {
         for (int i = 0; i < 10; i++)
         {
             Console.WriteLine("generating " + i);
             yield return i.ToString();
         }
     }

     static void Main(string[] args)
     {
         IEnumerable<string> IDs = GetIDs();

         foreach (string ID in IDs)
             Console.WriteLine("printing   " + ID);

         Console.Read();
     }
 }
}

Output:

generating 0
printing   0
generating 1
printing   1
generating 2
printing   2
generating 3
printing   3
generating 4
printing   4
generating 5
printing   5
generating 6
printing   6
generating 7
printing   7
generating 8
printing   8
generating 9
printing   9

As you can see, the system effectively pauses the loop when it returns an item to the foreach loop–the numbers are lazily generated when needed, not all at once before they are printed.

When an IEnumerable works, this can be very handy. Neat stuff.