Below is an example of using IEnumerable and yield. static void Main(string[] args) { Console.WriteLine("==== Multiple IEnumerable with values NOT changed:"); foreach (var item in TestYield(3, false)) Console.WriteLine(item.data); IEnumerable<C> iec; iec = TestYield(3, false); foreach (C item in iec) Console.WriteLine(item.data); iec = TestYield(3, false); foreach (C item in iec) Console.WriteLine(item.data); Console.WriteLine("==== Multiple IEnumerable with values changed:"); iec = TestYield(3, true); foreach (var v in iec) Console.WriteLine(v.data); iec = TestYield(3, true); foreach (var v in iec) Console.WriteLine(v.data); } public class C { public C(int dataIn) { data = dataIn; } public int data; } public static IEnumerable<C> TestYield(int count, bool addRandom) { int initValue = addRandom ? new Random().Next(10, 90) : 0; for( int i=0; i<count; i++ ) { yield return new C(initValue + 2 * i); //initValue = -99; // iteration resumes from the end of last yield, not the start of next yield } } Program result: