2016-11-24 4 views
3

イム初心者:その上に最初のものを格納するために、別の辞書_innerProducts = new Dictionary<string, string>();C#の "Dictionary nest"?次の操作を実行しようとしているC#と - 私で

_KitProducts = new Dictionary<string, Dictionary<string, string>>();

最初の1(

私は辞書を作成_ innerProducts)には、.xmlファイルから収集した約15の製品アトリビュートと、TKeyの製品コードが含まれています。すべてatributesを収集した後

私が呼ぶ:私が見ることができるよう

_KitProducts.Add(_innerProducts["cProd"], _innerProducts); 

私は、その作品は罰金、デバッグを経てこれを見たとき:

Before Clear

問題があることを私がすることはできません最初の_innerProducts "cProd"と同じTKeyを使用して別のグループの属性を追加してください。foreach内では、最後に_innerProducts.Clear();を置きます。私はそれをクリアしたときに、問題がはっきりしていないだけで、現在の_innerProducts、である、それはあまりにも_KitProductsのTValueをクリア

After Clear

イムではない、これがために「を参照することにより、これらのであれば確認してください私が読んだ(私は非常に始めていることを忘れないで)覚えている "価値ある"講義ではないので、私はこの場合何をすべきですか?

多くの場合、私はそれを保存する必要があることを知っています(しかし、私はまだEntity Frameworkを学びませんでした)、その間、私はちょうど学習目的に辞書に格納しています。

ありがとう、英語には申し訳ありません、私の主要な言語です。

+0

内部辞書のコピーを入れて、あなたがこれを行うために使用されている(問題のコードのように)コードを共有することができます。 – ChrisF

+3

さて、それはパラメータ渡しという点では "値で"ないし "参照で"ではありませんが、それは辞書が値に*参照*を保持しているからです。私はあなたがhttp://jonskeet.uk/csharp/references.htmlを読むことをお勧めします。あなたが達成しようとしていることは特に私には分かりませんが、C#のオブジェクトや参照の仕方を理解することは本当に重要です。 –

答えて

5

外側辞書に値を追加した後、両方_innerProductsおよび外側辞書エントリの値が同じオブジェクトを参照:

   +-----------------------+ 
      | your inner dictionary | 
      +-----------------------+ 
       ^  ^
       |   | 
     _innerProducts  value in the outer dictionary entry 

_innerProducts.Clear()を実行する、空のその次の結果と辞書:

   +-----------------------+ 
      | empty dictionary | 
      +-----------------------+ 
       ^  ^
       |   | 
     _innerProducts  value in the outer dictionary entry 

したがって

、代わりの既存インを空にするタンス、新しいインスタンスを作成して、すなわち、

次のような状況になり
_innerProducts = new Dictionary<string, string>(); // "a = ..." defines which object a refers to 

_innerProducts.Clear();  // "a.DoSomething()" operates on the object referenced by a 

を置き換える:

+-----------------------+ +-----------------------+ 
    | a new, empty dict. | | your inner dictionary | 
    +-----------------------+ +-----------------------+ 
         ^  ^
         |   | 
       _innerProducts  value in the outer dictionary entry 

こうすることで、既存の内部を変更しないでください代わりに、変数_innerProductsが新しいものを指すようにします。

でも簡単かつより良い、可能であれば:あなたは_KitProductsを埋めるために使用内_innerProductsの宣言を移動しループ。これは、各ループ反復が内部辞書のそれ自身のインスタンスを得ることを保証する。

+1

このような詳細を説明してくれてありがとう、私は問題を解決するだけでなく(新しい辞書に.Clear()を変更する)だけでなく、なぜそれが起こったのか理解しています! –

1

あなたがメイン辞書内のデータを変更することを避けたい場合は - ちょうど

var key = _innerProducts["cProd"]; 
var value = new Dictionary<string, string>(_innerProducts); 
_KitProducts.Add(key, value); 
関連する問題