public static void Recursively <T>(this T seed, SeedInclusion seedInclusion, Action <T, int> action, Func <T, IEnumerable <T> > getNext) where T : class { var stack = new Stack <Tuple <T, int> >(); if (seedInclusion == SeedInclusion.Include) { stack.Push(new Tuple <T, int>(seed, 0)); } else { var next = getNext(seed); foreach (var node in next.Reverse()) { stack.Push(new Tuple <T, int>(node, 0)); } } while (stack.Any()) { var node = stack.Pop(); action(node.Item1, node.Item2); var next = getNext(node.Item1); foreach (var following in next.Reverse()) { stack.Push(new Tuple <T, int>(following, node.Item2 + 1)); } } }
public static void Recursively <T>(this T seed, SeedInclusion seedInclusion, Action <T> action, Func <T, T> getNext) where T : class { var stack = new Stack <T>(); if (seedInclusion == SeedInclusion.Include) { stack.Push(seed); } else { var next = getNext(seed); if (next != null) { stack.Push(next); } } while (stack.Any()) { var node = stack.Pop(); action(node); var next = getNext(node); if (next != null) { stack.Push(next); } } }
public static void RecursivelyReversed <T>(this T seed, SeedInclusion seedInclusion, Action <T> action, Func <T, IEnumerable <T> > getNext) where T : class { var stack = new Stack <T>(); seed.Recursively(seedInclusion, stack.Push, getNext); while (stack.Any()) { action(stack.Pop()); } }