Countless were the times I've fired up Visual Studio to write the following example explaining what lazy evaluation is and why it's better to expose collections as IEnumerable<T>
:
using System.Collections.Generic; using System.Linq; using static System.Console; // If you replace the lazy call below with the eager one you get an out of memory error var oneToTen = LazyInfinity().Take(10); foreach (var n in oneToTen) WriteLine(n); // "In eager evaluation, the first call to the iterator will result in the entire collection being processed." // "A temporary copy of the source collection might also be required." static IEnumerable<int> EagerInfinity() { var i = 0; var infinity = new List<int>(); while (true) infinity.Add(++i); return infinity; } // "In lazy evaluation, a single element of the source collection is processed during each call to the iterator." static IEnumerable<int> LazyInfinity() { var i = 0; while (true) yield return ++i; }
More at:
Top comments (0)