0

以下のコードは、次の構造の辞書オブジェクトを作成することを目的としていますDictionary<string<Dictionary<string, string>。何らかの理由で、アイテムを追加するたびにキーテキストは正しいのですが、値(辞書)が前の値を上書きします。これはおそらく次のように説明する方が適切です。

反復1

  • key1、dictionary1

反復2

  • key1、dictionary2
  • key2、dictionary2

反復3

  • key1、dictionary3

  • key2、dictionary3

  • key3、dictionary3

これを引き起こしている原因と、各エントリの辞書の上書きを防ぐためにこのコードを修正するにはどうすればよいですか?

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されると、元のコピーではなく、参照として追加されます。

この問題を「適切に」解決するために、変数の宣言をQueryNameUserQueryStringwhileスコープ内に移動します。そうすれば、複数の反復にまたがってではなく、単一の反復のスコープにのみ存在できることを確認できます。に追加されるDialectDictionaryと、参照はそのディクショナリに残り、スコープを離れても安全です。

于 2012-08-07T08:25:18.070 に答える
2

毎回同じQueryNameUserQueryStringのインスタンスを使用しています。交換

QueryNameUserQueryString.Clear();

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