-1

だから私はこのようなC#foreachループを手に入れました

foreach(Type s in source)
{    
    dic1.Clear();
    dic1.Add(Key1, s.Attr1);
    dic1.Add(Key2, s.Attr2);
    ...
    dic1.Add(KeyN, s.AttrN);
    dic2.Add(ind, dic1);
    ind++;
}

値を取得して正しく設定しますが、問題はありません。しかし、が呼び出されると、に追加されたものがdic1.Clear()クリアされ、 処理される新しいデータでその内容が書き換えられ、最後に処理されたデータ/オブジェクトと同じデータを持つN個の辞書が生成されます。に追加されたものに本当に影響しますか?もしそうなら、私はそれをコピーして追加する必要がありますか?dic1dic2dic1.Clear()dic2dic1dicTempdic2

よろしくお願いします。

4

2 に答える 2

1

私は今あなたの質問を受けると思います。

コレクションに参照オブジェクトを追加すると、値ではなく、オブジェクトへの参照が格納されます。

あなたがすべきことはdic1、ループ本体にローカルにすることです。

foreach(Type s in source)
{    
    var dic1 = new Dictionary<T1, T2>();
    dic1.Add(Key1, s.Attr1);
    dic1.Add(Key2, s.Attr2);
    ...
    dic1.Add(KeyN, s.AttrN);
    dic2.Add(ind, dic1);
    ind++;
}
于 2012-11-30T12:51:40.410 に答える
1

これにより、1つのインスタンスのみを操作するため、次のようになりますdic1

  • dic2同じディクショナリインスタンスを参照する際のすべての値
  • そのインスタンスは、各反復の開始時にクリアされます。

dic1.Clear()行をに変更することをお勧めしますdic1 = new Dictionary<X, Y>()

于 2012-11-30T12:52:11.973 に答える