2

4 つの Dictionary があり、2 つは (Dictionary 内の辞書)、以下に示す宣言です。

    Dictionary<string, Dictionary<string, string>> dict_set = new Dictionary<string, Dictionary<string, string>>();
    Dictionary<string, Dictionary<string, string>> dict_Reset = new Dictionary<string, Dictionary<string, string>>();
    Dictionary<string, string> set_value = new Dictionary<string, string>();
    Dictionary<string, string> Reset_value = new Dictionary<string, string>();

最初に辞書 set_vlaue と Reset_value に要素を追加したいと思います。値が追加されたら、以下に示すように、これらの辞書を他の 2 つの辞書に追加します。

dict_set.Add(condiName, set_value);
dict_Reset.Add(condiName, Reset_value);
 set_value.Clear();
 Reset_value.Clear();

値が追加されていますが、set_value および reset_value 辞書を追加した後、これら 2 つの辞書 set_value および reset_value をクリアしたいのですが、set_value および reset_value をクリアすると、dict_set および dict_reset からのデータもクリアされるという問題が発生します。

この場合、辞書のディープコピーを作成する方法を教えてください...

4

4 に答える 4

1

スキートがキーボードPによって指摘された回答に書いたことは別として、ほとんどのマネージ言語では、次の方法でディープコピーを非常に簡単に実行できます。

  • ものをシリアライズする
  • 逆シリアル化して戻す

逆シリアル化すると、通常、元の完全なディープ クローンが作成されます。シリアライザーは通常、すべての ID チェック、サイクルの中断、重複排除などを行います。あなたの場合、これは必要ありませんが、後で便利になるかもしれません。

XML、BinaryForm、JSON、または手元にある好きなものにシリアル化できます。それほど重要ではありません。

質問に戻ります。

これはあなたのコードですが、少し短くしただけです:

var dict_set = new Dictionary<string, Dictionary<string, string>>();
var dict_Reset = new Dictionary<string, Dictionary<string, string>>();
var set_value = new Dictionary<string, string>();
var Reset_value = new Dictionary<string, string>();

dict_set.Add(condiName, set_value);
dict_Reset.Add(condiName, Reset_value);

set_value.Clear();
Reset_value.Clear();

あなたはそれを主張します:

(...)しかし、set_valueとreset_valueがクリアされると、dict_setとdict_resetからのデータもクリアされるという問題が発生します..

これは正しくありません。上記のコードでは、できません。set/reset/dict_set/dict_reset は 4 つの異なるオブジェクトです。「set/reset」で「Clear」を呼び出しても、他のものをクリアすることはできません

コードを見てください。エラーは他の場所にあります。ここではありません。他の何かがその dict* 辞書をクリアしています。

于 2013-07-03T09:10:07.693 に答える
0

このように dict_set と dict_Reset の内部辞書はクリアされないと思います

dict_set.Add(condiName, set_value.ToDictionary(entry => entry.Key,entry => entry.Value));
dict_Reset.Add(condiName, Reset_value.ToDictionary(entry => entry.Key,entry => entry.Value));
set_value.Clear();
Reset_value.Clear();

ToDictionary() メソッドを使用すると、実際に新しい Dictionary オブジェクトを作成し、ツアーのオリジナル辞書への参照を使用しなくなるため、それらを安全にクリアできます。set_value および Reset_value へのデータの追加および削除は、dict_set および dict_Reset 内の辞書には影響しません。

好奇心から、大文字の S を含む Reset_value と set_value を含まないのはなぜですか?

于 2013-07-03T11:11:33.353 に答える