public P_TreeNodeTransformState(TSource source) { if (source == null) { throw new ArgumentNullException(paramName: nameof(source)); } // Parent = null; Source = source; SourceChildren = null; TransformedSourceChildren = new List <TResult>(); }
public P_TreeNodeTransformState(P_TreeNodeTransformState <TSource, TResult> parent, TSource source) { parent.EnsureNotNull(nameof(parent)); if (source == null) { throw new ArgumentNullException(paramName: nameof(source)); } // Parent = parent; Source = source; SourceChildren = null; TransformedSourceChildren = new List <TResult>(); }
public static TResult Transform <TSource, TResult>(this SingleTreeNodeUtilitiesHandle <TSource> hnd, Func <TSource, IEnumerable <TSource> > childrenSelector, Func <TSource, IEnumerable <TResult>, TResult> transform) { childrenSelector.EnsureNotNull(nameof(childrenSelector)); transform.EnsureNotNull(nameof(transform)); // var root = new P_TreeNodeTransformState <TSource, TResult>(hnd.Source); var traversalStack = new Stack <P_TreeNodeTransformState <TSource, TResult> >(root.Sequence()); for (; traversalStack.Count > 0;) { var currentTraversalEntry = traversalStack.Peek(); // var initialSizeOfTraversalStack = traversalStack.Count; if (currentTraversalEntry.SourceChildren == null) { currentTraversalEntry.SourceChildren = childrenSelector(currentTraversalEntry.Source) .EmptyIfNull() .ToArray(); for (var i = currentTraversalEntry.SourceChildren.Length - 1; i > -1; i--) { traversalStack .Push( new P_TreeNodeTransformState <TSource, TResult>( currentTraversalEntry, currentTraversalEntry.SourceChildren[i])); } } // if (initialSizeOfTraversalStack == traversalStack.Count) { traversalStack.Pop(); if (!ReferenceEquals(currentTraversalEntry, root)) { currentTraversalEntry .Parent .TransformedSourceChildren .Add(transform(currentTraversalEntry.Source, currentTraversalEntry.TransformedSourceChildren)); } } } return(transform(root.Source, root.TransformedSourceChildren)); }