Я новичок в C #, и сейчас я пытаюсь бросить себе вызов с другими проблемами.
В данный момент я пытаюсь создать веб-приложение, в котором вы можете вводить буквы и символы подстановки для поиска возможных слов.
Из предыдущих вопросов по этому поводу я решил создать Trie, содержащий буквы, созданные из 400 000 слов +. Позже я буду искать в Trie возможные совпадения слов в зависимости от ввода букв и подстановочных знаков.
Я построил два класса, один представляющий один узел в Trie, а другой представляющий весь Trie.
Я сейчас нахожусь в тупике, моя проблема в том, что я хочу добавить несколько детей в Trie на нескольких уровнях, и каждый ребенок должен быть уникальным.
Выполнение этого вручную будет выглядеть примерно так:
//Level 1
Root.Children.Add(new TrieNode(Letter, false, new List<TrieNode>()));
//Level 2
Root.Children[0].Children.Add(new TrieNode(Letter, false, new List<TrieNode>()));
//Level 3
Root.Children[0].Children[0].Children.Add(new TrieNode(Letter, false, new List<TrieNode>()));
Проблема в том, что я хочу добавить детей с одним или несколькими циклами, и делать это таким образом кажется немного «неправильным»:
LetterArray = Word.ToCharArray();
int level = 0;
foreach (char Letter in LetterArray)
{
//Level 1
if (level == 0)
Root.Children.Add(new TrieNode(Letter, false, new List<TrieNode>()));
//Level 2
if (level == 1)
Root.Children[0].Children.Add(new TrieNode(Letter, false, new List<TrieNode>()));
//Level 3
if (level == 2)
Root.Children[0].Children[0].Children.Add(new TrieNode(Letter, false, new List<TrieNode>()));
level++;
}
Что мне нужно, так это один или несколько циклов с «чистым» кодом, думаете, вы можете мне помочь?
Думаю, для того, чтобы Trie можно было искать позже, буквы должны быть в порядке.
Вот мои другие вопросы, связанные с этим: Вопрос 1 , Вопрос 2 .
Вот мой класс TrieNode:
public class TrieNode
{
private char _Letter;
private bool _IsEndOfWord;
private List<TrieNode> _Children;
public char Letter {
get { return _Letter; }
set { _Letter = value; }
}
public bool IsEndOfWord {
get { return _IsEndOfWord; }
set { _IsEndOfWord = value; }
}
public List<TrieNode> Children {
get { return _Children; }
set { _Children = value; }
}
public TrieNode(char letter, bool isEndOfWord, List<TrieNode> children) {
Letter = letter;
IsEndOfWord = isEndOfWord;
Children = children;
}
}
… и вот мой класс Три:
public class Trie
{
private TrieNode _Root;
public TrieNode Root
{
get { return _Root; }
set { _Root = value; }
}
public Trie(List<string> Words)
{
Root = new TrieNode('^', false, new List<TrieNode>());
char[] LetterArray;
foreach (String Word in Words)
{
LetterArray = Word.ToCharArray();
foreach (char Letter in LetterArray)
{
// Here is where I want to add nodes to my Trie
}
}
}
}