我正在制作一个拼字游戏骗子类型的程序,用户输入一组字母,在字母混乱之后,将它们与我存储在数据库中的单词列表进行比较。因为在数据库中搜索每个字母组合是如此之慢,我尝试先将这些单词存储在List中,这样它们就可以在内存中使用,这确实提高了性能。但是我希望通过将列表中的单词列表存储在Hashtable中来加快速度,其中键是该单词的第一个字母,但我对如何处理它有点困惑。
我所拥有的(显然不会起作用)是:
public Hashtable populateWordTable()
{
Hashtable wordTable = new Hashtable();
List<string> wordTableWordList = new List<string>();
connect = new SqlConnection(connectionString);
SqlCommand find = new SqlCommand("Select * FROM English order by Word", connect);
// starting with first record, store each word into the List<string> wordlist
SqlDataReader dr = null;
int found = 0;
try
{
connect.Open();
dr = find.ExecuteReader();
string key = string.Empty;
string keyStartingPosition = "a";
while (dr.Read())
{
// if word is present
if (!dr.IsDBNull(0))
{
found = Convert.ToInt32(dr[0]);
key = dr[1].ToString().Substring(0, 1);
}
if (found > 0)
{
// if we have transitioned to the next letter in the alphabet
if (key != keyStartingPosition)
{
wordTable.Add(keyStartingPosition, wordTableWordList);
List<string> newList = new List<string>();
newList.Add(dr[1].ToString());
keyStartingPosition = key;
}
// still in the same letter in the alphabet
else
{
wordTableWordList.Add(dr[1].ToString());
}
}
}
}
catch (Exception ex)
{
}
finally
{
connect.Close();
}
return wordTable;
}
答案 0 :(得分:2)
之前做过这样的事情,我发现最好的结构是DAWG(directed acyclic word graph)。去年我将Steve Hanov's Python DAWG builder翻译成了C#,但是当RAID驱动器出现故障时丢失了它。你不应该太难翻译成C#。
答案 1 :(得分:1)
您应该使用Dictionary<char, IEnumerable<string>>
(Reference)。它的用法相当简单,当你添加单词时,首先检查它是ContainsKey(word[0])
,如果它不是你Add
它。您可以先分配一个空列表,然后在每次迭代中填充它,或者首先构建列表,然后将其分配给键。这取决于你。