- PR -

C# ArrayList のコピーについて

投稿者投稿内容
もも
常連さん
会議室デビュー日: 2005/07/25
投稿数: 46
投稿日時: 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/08/13
投稿数: 1019
投稿日時: 2005-09-08 14:52
ArrayList list2 = new ArrayList(list);
じゃなかったかな?
葉瀬崎浩樹
大ベテラン
会議室デビュー日: 2005/06/28
投稿数: 115
お住まい・勤務地: 兵庫県
投稿日時: 2005-09-08 14:59
思いついた方法を3つ書きます。
3つ目がお勧めですかね。

  • clsDataをClassではなくStructにする。素人にはお勧めできない、諸h(略
  • ディープコピーを作成するメソッドを、別途用意する
  • clsDataにIClonableインタフェイスを継承させ、
      Clone()で、ディープコピーを作成する実装にする。
      で、下記コーディングに変更。
    コード:
    ArrayList list2 = list.Clone();


#環境無いので未確認です。

#指摘を受けたのでStructに注意書きを追加

[ メッセージ編集済み 編集者: 葉瀬崎浩樹 編集日時 2005-09-08 15:38 ]
葉瀬崎浩樹
大ベテラン
会議室デビュー日: 2005/06/28
投稿数: 115
お住まい・勤務地: 兵庫県
投稿日時: 2005-09-08 15:05
引用:

囚人さんの書き込み (2005-09-08 14:52) より:
ArrayList list2 = new ArrayList(list);
じゃなかったかな?



ArrayList コンストラクタ

単純にいけるならこっちのがいいですね〜。勉強になります('▽')
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2005-09-08 15:18
ArrayListのコンストラクタでは、ディープコピーにはなりません。

また、structにする方法も、お勧めしません。
(おそらく、後で苦労します)

IClonableも使うときに、キャストがいるので嬉しくないです。

結局、自分でディープコピーせざるを得ないと思います。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-08 15:19
あ、だめだ^^;
葉瀬崎浩樹さんの書き込みをみて気づきました。

ArrayList の要素がそれぞれコピーされても、clsData の参照を渡しているだけだからだめですね。
葉瀬崎浩樹さんの言う通り、clsData にも仕掛けが必要ですね。

もも
常連さん
会議室デビュー日: 2005/07/25
投稿数: 46
投稿日時: 2005-09-08 15:22
囚人さん,葉瀬崎浩樹さんありがとうございます。
まず、囚人さんの方法ですが、試してみたのですが、メッセージボックスでは、
「10」と表示されてしまいました・・・・
しかし、こういう書き方があるんですね。勉強になりました。

葉瀬崎浩樹さんの方法は、新しい言葉「ディープコピー」がでてきたので、
ちょっと調べてみます。

「ディープコピー」は、もし、clsDataが int No と、string Data、ArrayList list
の場合には、どうしたらよいのか・・・・

また、質問させていただくかもしれません・・・よろしくお願いします。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-09-08 15:36
結局 = は絶対に参照しかコピーしないってことですね。(classは)
Object.MemberwiseClone() なんかもご参考に。

スキルアップ/キャリアアップ(JOB@IT)