- - PR -
C# ArrayList のコピーについて
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-09-08 14:24
ArrayListのコピーについて質問させてください。
今、 ArrayList list = new ArrayList(); for(int i = 0 ; i < 5 ; i++) { clsData d = new clsData(); d.No = i; d.Data = i.ToString("00"); list.Add(d); } ArrayList list2 = list; ←・・・・・・・ここ clsData b = (clsData)list2[1]; b.No = 10; b.Data = (10).ToString("00"); clsData c = (clsData)list[1]; MessageBox.Show(c.Data); ---------------------------------------------- clsDataは、int No と、string Dataのクラスです。 ---------------------------------------------- とすると、メッセージボックスには「10」と表示され、listのデータが 書き換わっています。 調べてみると、ArrayListのコピーは、参照コピーになってしまうという ところまで分かりました。 「ここ」の部分をうまいこと書き換えて、値コピーをし、メッセージボックス に「01」と表示させるには、どのようにしたらよいのでしょうか。 ご教授お願いできませんでしょうか。 よろしくお願い致します。 | ||||
|
投稿日時: 2005-09-08 14:52
ArrayList list2 = new ArrayList(list);
じゃなかったかな? | ||||
|
投稿日時: 2005-09-08 14:59
思いついた方法を3つ書きます。
3つ目がお勧めですかね。
#環境無いので未確認です。 #指摘を受けたのでStructに注意書きを追加 [ メッセージ編集済み 編集者: 葉瀬崎浩樹 編集日時 2005-09-08 15:38 ] | ||||
|
投稿日時: 2005-09-08 15:05
ArrayList コンストラクタ 単純にいけるならこっちのがいいですね〜。勉強になります('▽') | ||||
|
投稿日時: 2005-09-08 15:18
ArrayListのコンストラクタでは、ディープコピーにはなりません。
また、structにする方法も、お勧めしません。 (おそらく、後で苦労します) IClonableも使うときに、キャストがいるので嬉しくないです。 結局、自分でディープコピーせざるを得ないと思います。 | ||||
|
投稿日時: 2005-09-08 15:19
あ、だめだ^^;
葉瀬崎浩樹さんの書き込みをみて気づきました。 ArrayList の要素がそれぞれコピーされても、clsData の参照を渡しているだけだからだめですね。 葉瀬崎浩樹さんの言う通り、clsData にも仕掛けが必要ですね。 | ||||
|
投稿日時: 2005-09-08 15:22
囚人さん,葉瀬崎浩樹さんありがとうございます。
まず、囚人さんの方法ですが、試してみたのですが、メッセージボックスでは、 「10」と表示されてしまいました・・・・ しかし、こういう書き方があるんですね。勉強になりました。 葉瀬崎浩樹さんの方法は、新しい言葉「ディープコピー」がでてきたので、 ちょっと調べてみます。 「ディープコピー」は、もし、clsDataが int No と、string Data、ArrayList list の場合には、どうしたらよいのか・・・・ また、質問させていただくかもしれません・・・よろしくお願いします。 | ||||
|
投稿日時: 2005-09-08 15:36
結局 = は絶対に参照しかコピーしないってことですね。(classは)
Object.MemberwiseClone() なんかもご参考に。 |
1|2|3
次のページへ»