public async Task <IWordTree> BuildFrom(Stream stream) { Debug.Assert(stream != null); using var reader = new StreamReader(stream); IWordTree tree = new WordTree(); string currentLine; while ((currentLine = await reader.ReadLineAsync()) != null) { tree.AddWord(currentLine); } return(tree); }
protected List <char[]> FindWordsIn(char[] prefix, char[] remaining) { Debug.Assert(prefix != null); Debug.Assert(remaining != null); if (remaining.Length <= 0) { return(new List <char[]>()); } // foreach letter in remainig // combine with prefix and then call again List <char[]> found = new List <char[]>(); for (int index = 0; index < remaining.Length; index++) { char ch = remaining[index]; char[] newprefix = new char[prefix.Length + 1]; Array.Copy(prefix, newprefix, prefix.Length); newprefix[newprefix.Length - 1] = ch; Console.WriteLine(newprefix); // TODO: Update wortree to use char[] var newprefixstr = new string(newprefix); if (newprefixstr.Length >= MinWordLength && WordTree.IsWord(newprefixstr)) { found.Add(newprefix); } char[] newremaining = new char[remaining.Length - 1]; int newremindex = 0; for (int i = 0; i < remaining.Length; i++) { if (i == index) { // skip this one continue; } newremaining[newremindex] = remaining[i]; newremindex++; } found.AddRange(FindWordsIn(newprefix, newremaining)); } //foreach(char ch in remaining) { // char[] newprefix = new char[prefix.Length + 1]; // Array.Copy(prefix, newprefix, prefix.Length); // newprefix[newprefix.Length - 1] = ch; // Console.WriteLine(newprefix); // // TODO: Update wortree to use char[] // if (WordTree.IsWord(new string(newprefix))) { // found.Add(newprefix); // } // char[] newremaining = new char[remaining.Length - 1]; // newremaining = remaining[1..]; // found.AddRange(FindWordsIn(newprefix, newremaining)); //} return(found); }