2017-10-15 7 views
1

私は請求書を追跡するプログラムを持っています。法案が毎月繰り返されている場合は、それらの日付(1年まで)をリストに追加したいと思います。DateTime AddMonthsが代わりに乗算されます

//code changed for brevity but same principle applies 
private List<Bill> GenerateRecurring(Bill bill) 
{ 
    //bill.DueDate = Convert.ToDateTime("10/14/2017"); 
    var Bills = new List<Bill>(); 
    for (int i = 1; i <= 12; i++) 
    { 
     var newBill = bill; 
     newBill.DueDate = bill.DueDate.AddMonths(i); 
     Bills.Add(newBill); 
    } 
    return Bills; 
} 

私はなど、日付2017年11月14日、2017年12月14日を持っている手形の要素を期待し、その代わりに、彼らは2017年11月14日、2018年1月14日、4月14日です/ 2018など

ループ内で毎回 'bill.DueDate'が更新されているのですか、何か不足していますか?

+0

newBillに請求書を割り当てることでオブジェクトはコピーされませんが、両方の変数が同じオブジェクトインスタンスを指しているだけです。同じ値を持つクラスの新しいインスタンスを作成するには、明示的にBillクラスにメソッドを追加する必要があります。 – NineBerry

+0

あなたのdueDateをループの前に保存し、それを使って請求書の新しい日付を作成してください –

答えて

6

var newBill = bill;は、既存の請求書から新しい請求書を作成するのではなく、既存の請求書に別の名前を付けるだけです。したがって、常に同じオブジェクトを更新し、同じオブジェクトをBillsコレクションに追加しています(ループの後にBillsに1回の請求書が12回含まれます)。 。

+0

また、請求書リストはメソッドのスコープに入れる必要があります –

1

問題は実際にはvar newBill = bill行にあります。これは新しい請求書を作成するものではありませんが、実際はあなたの古い請求書への参照です。その結果、ループが実行されるたびに、同じ日付がインクリメントされます。

関連する問題