Я новичок в C# и в данный момент пытаюсь бросить себе вызов с разными задачами.
На данный момент я пытаюсь создать веб-приложение, в котором вы можете вводить буквы и подстановочные знаки для поиска возможных слов.
Из предыдущих вопросов по этому поводу я решил создать Trie, содержащее буквы, сгенерированные из более чем 400 тысяч слов. Позже я буду искать в 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;
}
}
… и вот мой класс Trie:
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
}
}
}
}
public char Letter { get; set; }
,public bool IsEndOfWord { get; set; }
,public List<TrieNode> Children { get; set; }
. - person ANeves thinks SE is evil   schedule 19.09.2011