0

我有下面的代码,旨在构建具有以下构造的字典对象Dictionary<string<Dictionary<string, string>。出于某种原因,每次我向其中添加一个项目时,关键文本都是正确的,但值(字典)会覆盖前一个。这可能更好地解释如下:

迭代 1

  • 键1,字典1

迭代 2

  • 键1,字典2
  • 键2,字典2

迭代 3

  • 键1,字典3

  • 键2,字典3

  • 键3,字典3

造成这种情况的原因是什么,如何修复此代码以阻止它覆盖每个条目中的字典?

QueryNameUserQueryString = new Dictionary<string, string>();
DialectDictionary = new Dictionary<string, Dictionary<string, string>>();

while (dataBaseConnection.NextRecord())
                {
                if (QueryNameUserQueryString != null)
                    {
                    QueryNameUserQueryString.Clear();
                    }

                string dialect = dataBaseConnection.GetFieldById (0);

                //If no dialect then carry out next iteration
                if (String.IsNullOrEmpty (dialect))
                    {
                    continue;
                    }

                try
                    {
                    dataBaseConnection2.ExecutePureSqlQuery ("SELECT * FROM " + sqlFactoryTable + " WHERE SQL_FACTORY_DIALECT = '" + dialect + "'");
                    }
                catch
                    {
                    dataBaseConnection.Close();
                    dataBaseConnection2.Close();

                    throw;
                    }

                //Do we have query strings for this dialect?
                if (!dataBaseConnection2.HasRows())
                    {
                    continue;
                    }

                //loop through query strings
                while (dataBaseConnection2.NextRecord())
                    {
                    string queryName = dataBaseConnection2.GetFieldById (2);
                    string queryString = dataBaseConnection2.GetFieldById (3);
                    string user = dataBaseConnection2.GetFieldById (4);

                    //create composite key for dictionary
                    string compositeKey = dialect + "," + queryName + "," + user;

                    if (QueryNameUserQueryString != null)
                        {
                        //Construct our query string dictionary
                        QueryNameUserQueryString.Add (compositeKey, queryString);
                        }
                    }

                //If we have a query string dictionary
                if (QueryNameUserQueryString != null)
                    {
                    //Ensure m_dialect dictionary is not null
                    if (DialectDictionary != null)
                        {
                        //Construct our dictionary entry for this dialect
                        DialectDictionary.Add (dialect, QueryNameUserQueryString);
                        }
                    }
                }
            }
4

2 回答 2

4

您似乎QueryNameUserQueryString在每次迭代中都使用相同的实例。当它被添加到 时DialectDictionary,它被添加为参考 - 而不是原件的副本。

为了“正确”解决问题,我会将QueryNameUserQueryString变量的声明移到 while 范围内。这样,您将确保它只能存在于单个迭代的范围内,而不是多个迭代。当它被添加到 时DialectDictionary,该引用仍然存在于该字典中,您可以安全地离开范围。

于 2012-08-07T08:25:18.070 回答
2

您每次都使用相同的 QueryNameUserQueryString 实例。代替

QueryNameUserQueryString.Clear();

QueryNameUserQueryString = new Dictionary<string, string>();
于 2012-08-07T08:21:46.723 回答