teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2017/06/23 09:30

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -12,7 +12,7 @@
12
12
  ID:0
13
13
 
14
14
  この通りにListにはインスタンスが設定されているので、リストを逐次出力すると
15
- bundleTransactionの最終状態が何度も出力されることになってしまいます。
15
+ bundleTransaction(ID:0)の最終状態が何度も出力されることになってしまいます。
16
16
 
17
17
  #追記
18
18
 

1

追記

2017/06/23 09:30

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -12,4 +12,39 @@
12
12
  ID:0
13
13
 
14
14
  この通りにListにはインスタンスが設定されているので、リストを逐次出力すると
15
- bundleTransactionの最終状態が何度も出力されることになってしまいます。
15
+ bundleTransactionの最終状態が何度も出力されることになってしまいます。
16
+
17
+ #追記
18
+
19
+ 解決策を書いていませんでした。
20
+ ToList()が必要な場合は、bundleTransactionを返す時にクローンを作って戻すことです。
21
+ これには2通りの方法があります。
22
+
23
+ 1.クローンメソッドをTransactionクラスに作成して使う
24
+ 今回はシャローコピーで十分ですから、MemberwiseCloneメソッドが使えます。
25
+ シャローコピーで十分な条件というのは中身のデータが全てイミュータブルであるということです。
26
+
27
+ ```C#
28
+ public class Transaction
29
+ {
30
+ public int Id { get; set; }
31
+
32
+ public DateTime Date { get; set; }
33
+
34
+ public int Deposit { get; set; }
35
+
36
+ /// <summary>
37
+ /// 同一の情報を持つ新しい Transaction のインスタンスを生成して返します。
38
+ /// </summary>
39
+ public Transaction CreateClone()
40
+ {
41
+ return (Transaction)MemberwiseClone();
42
+ }
43
+ }
44
+ ```
45
+ 後は`yield return bundleTransaction`を`yield return bundleTransaction.CreateClone()`に書き換えましょう。
46
+
47
+ 2.Transactionをクラスではなく構造体にしてしまう
48
+ 16バイト以下ですし、後からデータの修正が起きないのであれば構造体にしてしまうという方法もあります。
49
+ 単純にclassをstructに変えるだけです。
50
+ 方法としては単純ですが、構造体の適切な取り扱いが分からない場合は1番を使った方が良いです。