2017-05-08 8 views
-2

皆さん!C#のListに新しい要素を追加すると、前に追加された要素が変更されています

私は、forの各繰り返しで異なる値を割り当てるweights_c1というdouble []配列を持っています。 また、各ループにベクトルweights_c1を格納するwc1というリストもあります。 だから、私は実行します。

wc1.Add(weights_c1); 

問題は、この方法では、プログラムは前にリストに追加された要素の値を変更することです。

例:最初の繰り返しで 私は

wc1[0] = {1.0, 3.4, 2.2} 

を有する第二の反復がwc1[1] = {2.0, 4.5, 1.0}とオンになると、WC1の要素は、[0]も同じ値{2.0, 4.5, 1.0}を想定し、これは後になるまで後に起こりますループの終わり。

このプログラムは、weights_c1の現在の値を「リンク」していて、以前にリストに追加された値を自動的に更新します。

どうすればこの問題を解決できますか?

+4

あなたがコードを示したい場合、それは本当に助けを持っているだろうが、私はあなたのその99.9%確信しています同じ配列への参照を複数回追加するだけです。配列は参照型であることを覚えておいてください - 'List 'は配列オブジェクトへの* references *を含みます。リストに同じ参照が複数含まれている場合は、同じ要素が表示されます。 –

+0

コードを投稿できますか? – sachin

+0

ありがとう、みんな! dasblinkenlightの提案がうまくいきました。 –

答えて

1

この問題が発生する理由は、同じアレイオブジェクトweights_c1をリストに追加しているためです。配列は参照型であるため、List<double[]>は配列への参照を格納し、そのコピーは格納しません。リストに挿入した後に配列に加えた変更は、同じ配列オブジェクトであるため、リストに現在格納されている配列に「可視」になります。

あなたはこのように、リストにあなたの配列のコピーを挿入することによって、この問題を解決することができます

double[] copy = new double[weights_c1.Length]; 
weights_c1.CopyTo(copy, 0); 
wc1.Add(copy); 
+1

それは働いている! ありがとうございました! –

関連する問題