2012-04-06 19 views
0

をコピーすると、私は辞書の2D配列持って言うことができます:2D配列 -

public Dictionary<int, string>[,] mat = new Dictionary<int, string>[3, 5] 
{ 
    { new Dictionary<int, string>(), new Dictionary<int, string>(), new Dictionary<int, string>() }, 
    { new Dictionary<int, string>(), new Dictionary<int, string>(), new Dictionary<int, string>() }, 
    { new Dictionary<int, string>(), new Dictionary<int, string>(), new Dictionary<int, string>() }, 
    { new Dictionary<int, string>(), new Dictionary<int, string>(), new Dictionary<int, string>() },   
    { new Dictionary<int, string>(), new Dictionary<int, string>(), new Dictionary<int, string>() } 
} 

を、私は他にコピーこれに必要になります。私はすべての方法を試みた。以下のような
何か:

matNew = mat; 

が、私は最初のものを変更したときはまだ、それは自動的に2番目の1を変更します。
私は本当にこれを行う方法がわかりません。

+0

もう1つは変更されていますので、代わりにディープコピーが必要ですか? – payo

+0

@payo - はい、正確です。 –

+0

配列は参照型です。 "mat"はインスタンスへの参照にすぎず、 "matNew = mat"は実際の配列ではなく参照をコピーします。配列のコピーを作成しようとしていますか、配列のコピーとその中のすべての辞書を作成しようとしていますか? –

答えて

2

深いコピーが必要ですか?

var matNew = new Dictionary<int, string>[mat.GetLength(0), mat.GetLength(1)]; 
for (int i = 0; i < mat.GetLength(0); ++i) 
    for (int j = 0; j < mat.GetLength(1); ++j) 
     matNew[i, j] = new Dictionary<int, string>(mat[i, j]); 

Dictionary(IDictionary<TKey, TValue>)コンストラクタをコピーし、指定の辞書からすべての要素、そしておそらく既存の辞書のシャローコピーを実行する最速の方法です。あなたのキーと値は両方とも不変(intstring)なので、これはあなたのケースに適しています。