将字典存储到哈希表

时间:2013-07-24 17:57:31

标签: c# hashtable

我正在制作一个拼字游戏骗子类型的程序,用户输入一组字母,在字母混乱之后,将它们与我存储在数据库中的单词列表进行比较。因为在数据库中搜索每个字母组合是如此之慢,我尝试先将这些单词存储在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;
    }

2 个答案:

答案 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它。您可以先分配一个空列表,然后在每次迭代中填充它,或者首先构建列表,然后将其分配给键。这取决于你。