using System.Collections.Generic;
using CustomLINQExtensions;
public static void Main()
var collection = MakeCollection();
static List<Item> MakeCollection()
return Enumerable.Range(0, 10).Select(v => new Item(new Foo(v))).ToList();
static void WithoutLINQ(List<Item> collection)
Console.WriteLine("Without LINQ");
int totalIterationsOrCallsToMoveNext = 0;
int selectLoopIteration = 0;
int whereLoopIteration = 0;
int toListLoopIteration = 0;
List<Foo> foos = new List<Foo>();
foreach (var item in collection)
Console.WriteLine("Select: " + (++selectLoopIteration) + ", Total MoveNext Calls: " + (++totalIterationsOrCallsToMoveNext));
List<Foo> foosFiltered = new List<Foo>();
foreach (var foo in foos)
Console.WriteLine("Where: " + (++whereLoopIteration) + ", Total MoveNext Calls: " + (++totalIterationsOrCallsToMoveNext));
List<Foo> results = new List<Foo>();
foreach (var item in foosFiltered)
Console.WriteLine("ToList: " + (++toListLoopIteration) + ", Total MoveNext Calls: " + (++totalIterationsOrCallsToMoveNext));
static void WithLINQ(List<Item> collection)
Console.WriteLine("With LINQ");
int totalIterationsOrCallsToMoveNext = 0;
int selectLoopIteration = 0;
int whereLoopIteration = 0;
int toListLoopIteration = 0;
List<Foo> results = new List<Foo>();
Console.WriteLine("Select: " + (++selectLoopIteration) + ", Total MoveNext Calls: " + (++totalIterationsOrCallsToMoveNext));
Console.WriteLine("Where: " + (++whereLoopIteration) + ", Total MoveNext Calls: " + (++totalIterationsOrCallsToMoveNext));
foreach(var item in query)
Console.WriteLine("ToList: " + (++toListLoopIteration) + ", Total MoveNext Calls: " + (++totalIterationsOrCallsToMoveNext));
static void CustomLINQ(IEnumerable<Item> collection)
Console.WriteLine("Custom LINQ");
int totalIterationsOrCallsToMoveNext = 0;
int selectLoopIteration = 0;
int whereLoopIteration = 0;
int toListLoopIteration = 0;
Console.WriteLine("Select: " + (++selectLoopIteration) + ", Total MoveNext Calls: " + (++totalIterationsOrCallsToMoveNext));
Console.WriteLine("Where: " + (++whereLoopIteration) + ", Total MoveNext Calls: " + (++totalIterationsOrCallsToMoveNext));
Console.WriteLine("ToList: " + (++toListLoopIteration) + ", Total MoveNext Calls: " + (++totalIterationsOrCallsToMoveNext));
namespace CustomLINQExtensions
public static class CustomLINQExtensions
public static IEnumerable<TResult> MySelect<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
foreach (TSource item in source)
yield return selector(item);
public static IEnumerable<TSource> MyWhere<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
foreach (TSource item in source)
public static List<TSource> MyToList<TSource>(this IEnumerable<TSource> source, Action onItemAdded)
var result = new List<TSource>();
foreach(TSource item in source)