- PR -

配列のデータを変更したい

1
投稿者投稿内容
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2005-07-07 20:20
C#で開発しています。

社員情報を格納したクラスをArrayList配列に格納し、
あとでそのクラスの中身を変更する処理を作ってますが、
クラスの中身を変更しても中身が変更されません。
一度入れた中身を変更することは、できないのでしょうか?

// ArrayListに格納するクラス
public class MyEmp {
public string EmpNo;
public string EmpName;
}
static ArrayList AryEmpInfo = new ArrayList();

// ArrayList 配列への格納方法
MyEmp classEmp = new MyEmp();
classEmp.EmpNo = "123";
classEmp.EmpName = "太郎";
AryEmpInfo.Add(classEmp);

// ArrayList 配列の中身の変更の仕方
foreach (MyEmp My in AryEmpInfo) {
My.EmpNo = "456";
My.EmpName = "次郎";
}

sou
ベテラン
会議室デビュー日: 2002/09/25
投稿数: 56
投稿日時: 2005-07-07 21:41
引用:

ヘルプより:

foreach ステートメントは、配列またはオブジェクト コレクションのそれぞれの要素に対して埋め込みステートメントを繰り返します。foreach ステートメントは、コレクションを繰り返し処理して目的の情報を取得するのに使用しますが、予期しない動作を防ぐため、コレクション内容の変更には使用しないでください。このステートメントの形式は次のとおりです。



とヘルプにあるので、foreach ステートメントで内容の変更はやめたほうがいいのでは?forステートメントで行えばよろしいと思います。

コード:
MyEmp My;
for(int i = 0 ; i < AryEmpInfo.Count ; i ++)
{
      My = AryEmpInfo[i];
      My.EmpNo = "456";
      My.EmpName = "次郎";
}



一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2005-07-08 10:05
foreachで内容の変更をしてはいけないというのは、コレクション(今回はAryEmpInfo)の内容を変更してはいけない(コレクションから項目を削除とか)ということで、コレクションに参照されているインスタンスの値を変えてはいけないということではないと思います。

ちなみに村長さんのソースを動かしたら、正しく更新されました。
私はAryEmpInfoがstaticなのが気になりますネ。
foreachを実行した直後にブレークポイントを付けてAryEmpInfoの値を確認してみてください。
村長
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 67
投稿日時: 2005-07-08 11:10
souさん、一郎さん、レスありがとうございます。

朝一のリフレッシュした状態で再度デバックして調査したところ、
配列内の値が変更できないのではなく、違うことが原因であったことが
わかりました。

原因ですが、
画面の構成を動的に生成する画面を作っており、あるボタンを押下すると
別画面に遷移したかのように、画面の構成を変更する仕様です。
ボタンイベント前に必ずポストバックが行われることを忘れており、Page_Loadにて
再度コントロールを追加する処理を行っていなかったため、ボタンイベント処理時に
値を取得するコントロールが画面から無くなっていたことが原因でした。

ご教示ありがとうございました。
1

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