/// <summary> /// DFS traversal starting from given TrieNode and yield. /// </summary> private IEnumerable <TResult> Traverse <TResult>(TrieNode <TValue> trieNode, StringBuilder buffer, Func <StringBuilder, TValue, TResult> transform) { if (trieNode == null) { yield break; } if (trieNode.HasValue()) { yield return(transform ( buffer, trieNode.Value )); } foreach (var child in trieNode.GetChildren()) { // buffer is not used always but it's ok buffer.Append(child.Character); foreach (var item in Traverse(child, buffer, transform)) { yield return(item); } buffer.Length--; } }