コード例 #1
0
        public List <string> FindWordsWithPrefix(string prefix, int maxWords = int.MaxValue)
        {
            List <string> result     = new List <string>();
            Node          prefixNode = FindNodeWithPrefix(prefix);

            if (prefixNode == null)
            {
                return(result);
            }

            NodeWithText root = new NodeWithText {
                Node = prefixNode,
                Text = new StringBuilder(prefix)
            };

            foreach (NodeWithText node in IterateDepthFirst(root))
            {
                if (node.Node.IsWord)
                {
                    result.Add(node.Text.ToString());
                }

                if (result.Count == maxWords)
                {
                    break;
                }
            }

            return(result);
        }
コード例 #2
0
 NodeWithText GenerateNodeWithText(NodeWithText parent, char ch)
 {
     return(new NodeWithText {
         Node = parent.Node.Children[ch],
         Text = new StringBuilder(parent.Text.ToString()).Append(ch)
     });
 }
コード例 #3
0
        IEnumerable <NodeWithText> IterateDepthFirst(NodeWithText root)
        {
            Stack <NodeWithText> wordsStack = new Stack <NodeWithText>();

            wordsStack.Push(root);

            while (wordsStack.Count > 0)
            {
                NodeWithText node = wordsStack.Pop();
                yield return(node);

                foreach (char ch in node.Node.Children.Keys)
                {
                    NodeWithText newNode = GenerateNodeWithText(node, ch);
                    wordsStack.Push(newNode);
                }
            }
        }
コード例 #4
0
        IEnumerable <NodeWithText> IterateBreadthFirst(NodeWithText root)
        {
            Queue <NodeWithText> wordsQueue = new Queue <NodeWithText>();

            wordsQueue.Enqueue(root);

            while (wordsQueue.Count > 0)
            {
                NodeWithText node = wordsQueue.Dequeue();
                yield return(node);

                foreach (char ch in node.Node.Children.Keys)
                {
                    NodeWithText newNode = GenerateNodeWithText(node, ch);
                    wordsQueue.Enqueue(newNode);
                }
            }
        }