private static RecursiveDictionary <TResult> SelectRecursive_ <TSource, TResult>(int depth, TSource parent, TResult parentResult, RecursiveDictionary <TSource> dictionary, SelectRecursiveDelegate <TSource, TResult> selector) { var parentKvp = parent.PairWithValue(parentResult); var value = dictionary .Aggregate( new KeyValuePair < KeyValuePair <TResult, RecursiveDictionary <TResult> >, KeyValuePair <TSource, TResult> >[] { }, (left, v) => { var result = selector(depth, parentKvp, left.SelectValues().ToArray(), v.Key); var subset = SelectRecursive_(depth + 1, v.Key, result, v.Value, selector); var resultSet = result.PairWithValue(subset); return(left.Append(resultSet.PairWithValue(v.Key.PairWithValue(result))).ToArray()); }) .SelectKeys() .AsRecursive(); return(value); }
public static RecursiveDictionary <TResult> SelectRecursive <TSource, TResult>(this RecursiveDictionary <TSource> dictionary, SelectRecursiveDelegate <TSource, TResult> selector) { if (dictionary.IsDefault()) { return(default(RecursiveDictionary <TResult>)); } return(SelectRecursive_(0, default(TSource), default(TResult), dictionary, selector)); }