Combining @Jordao's answer and the fact that C#7 contains local functions, as @Oskar mentiond I think the following would be the "updated" answer:
public static IEnumerable<T> PreorderTraversal<T>(this BinaryTree<T> root) { IEnumerable<IEnumerable<T>> PreorderTraversalMulti<T>( this BinaryTree<T> root) { if (root == null) yield break; yield return root.Item.Pack(); // this packs an item into an enumerable yield return root.Left.PreorderTraversal(); yield return root.Right.PreorderTraversal(); } return PreorderTraversalMulti.Concat( PreorderTraversalMulti(root).Flatten()); }
I used this for a different reason - to get all files up to 3 stages inside and finalized with this function:
public static IEnumerable<FileInfo> EnumerateFiles(DirectoryInfo sourceFolder, string pattern, int steps2Enter, int currStep = 0, int maximumNumFiles = 800) { int total = 0; IEnumerable<FileInfo> NestedFunc() { if (currStep > steps2Enter) yield break; if (sourceFolder == null) yield break; foreach (var file in sourceFolder.GetFiles(pattern, SearchOption.TopDirectoryOnly)) { if (total++ > maximumNumFiles) yield break; yield return file; } } return NestedFunc().Concat(sourceFolder.EnumerateDirectories().SelectMany(s => EnumerateFiles(s, pattern, steps2Enter, currStep + 1, maximumNumFiles))); }
So yes - I'm still waiting for some syntatic sugar which will enable writing
yield return foreach...