static void Main(string[] args) { var popcornBags = new List<PopcornBag>(){ new PopcornBag{ Type = PopcornBagType.Bland }, new PopcornBag{ Type = PopcornBagType.Bland }, new PopcornBag{ Type = PopcornBagType.WithSugar }, new PopcornBag{ Type = PopcornBagType.WithSalt }, new PopcornBag{ Type = PopcornBagType.WithButter }, new PopcornBag{ Type = PopcornBagType.WithButter }, new PopcornBag{ Type = PopcornBagType.WithButter } }; var allBlandPopCornBags = popcornBags .deferredFilterBag(b => b.Type == PopcornBagType.Bland).ToList(); //No work is done here Console.WriteLine("Main Program: Although we have a deferred method, because we call .ToList()" + "the work is all done in the line above. \n"); //deferredFilterBag method does not do work here, //it already did in line 13. We will now access the list //that the allBlandPopCornBags variable references. foreach(var bag in allBlandPopCornBags) Console.WriteLine($"Main Program: We have a match and it's bland... But why do we all need to be special anyway?"); }