質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

444閲覧

Listに格納する段階でデータが変わる問題

Kaz51

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/06/29 01:13

編集2020/06/29 01:15

前提・実現したいこと

C#で予約管理システムを作っています。
csvファイルから読み取った予約情報をリストに格納する段階で格納したデータが全て最後に読み取ったデータに刺し変わってしまうエラーが発生しています。

発生している問題・エラーメッセージ

・実現したい結果 rdTmp.ReservationInfo[0].ReservationHolder = user1 rdTmp.ReservationInfo[1].ReservationHolder = user2 rdTmp.ReservationInfo[2].ReservationHolder = user3 ・結果 rdTmp.ReservationInfo[0].ReservationHolder = user3 rdTmp.ReservationInfo[1].ReservationHolder = user3 rdTmp.ReservationInfo[2].ReservationHolder = user3

該当のソースコード

C#

1var rdTmp = new ReservationData(); 2var rdiTmp = new ReservationData_inner(); 3 4string str3 = { 5 user1,2020/5/10,2020/5/14\n 6 user2,2020/5/16,2020/5/24\n 7 user3,2020/5/28,2020/6/15 8}; 9 10string[] strarr2 = str3.Split('\n'); 11string[] strarr3 = new string[4]; 12for (int ki = 0; ki < strarr2.Length; ki++) 13{ 14// カンマ区切りで読み出す「予約者名、予約開始日、予約終了日」 15 strarr3 = strarr2[ki].Split(','); 16 rdiTmp.ReservationHolder = strarr3[0]; 17 rdiTmp.StartDate = DateTime.Parse(strarr3[1]); 18 rdiTmp.EndDate = DateTime.Parse(strarr3[2]); 19 // rdTmpへ追加 20 rdTmp.ReservationInfo.Add(rdiTmp); 21} 22 23public class ReservationData { 24 public string Number { get; set; } 25 public string PictureDir { get; set; } = ""; 26 public List<ReservationData_inner> ReservationInfo { get; set; } = new List<ReservationData_inner>(); 27} 28 29public class ReservationData_inner { 30 public string ReservationHolder { get; set; } = ""; 31 public DateTime StartDate { get; set; } = new DateTime(); 32 public DateTime EndDate { get; set; } = new DateTime(); 33} 34 35 36-結果---------------------------------------- 37 rdTmp.ReservationInfo[0] = user3,2020/5/28,2020/6/15 38 rdTmp.ReservationInfo[1] = user3,2020/5/28,2020/6/15 39 rdTmp.ReservationInfo[2] = user3,2020/5/28,2020/6/15 40 41

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2020/06/29 01:29

同じインスタンスをAddしているからでは?
guest

回答2

0

同一のオブジェクト(rdiTmpの参照先)のデータを上書きしては
rdTmp.ReservationInfoにAddしているので,そうなるのは当たり前では.

投稿2020/06/29 01:29

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kaz51

2020/06/29 04:35

解答ありがとうございます。 原因理解しました。オブジェクトの考え方を整理します。
guest

0

ベストアンサー

C#

1var rdiTmp = new ReservationData_inner();

これをfor文の中に突っ込みましょう

投稿2020/06/29 01:28

ozwk

総合スコア13553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kaz51

2020/06/29 04:32

解答ありがとうございます。 ご指摘のようにしたら適切にデータ格納できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問