2016-08-10 5 views
1

私のアプリケーションにイベントのタイムラインを構築する2つのforeachループがあります。タイムラインの詳細オブジェクトのリストであるタイムラインリストオブジェクトがあります。コードは次のようになります。モデルリストにモデルを正しく追加しないC#foreachステートメント

var viewModel = new TimeLineListViewModel(); 
var timelineDetailsViewModel = new TimelineDetailsViewModel(); 

var referralDiaryEvents = _referralService.GetReferralDiaryEventsByReferralId((int)referralId).ToList(); 

var referral = _referralService.GetReferral((int)referralId); 

foreach (var referralDiaryEvent in referralDiaryEvents) 
{ 
1 timelineDetailsViewModel.EventDate = referralDiaryEvent.App_DiaryEvent.EventDateTimeScheduled; 
2 timelineDetailsViewModel.EventType = referralDiaryEvent.App_DiaryEvent.Ref_EventType.Description; 
3 timelineDetailsViewModel.EventDescription = referralDiaryEvent.App_DiaryEvent.EventName; 

4 viewModel.TimeLineList.Add(timelineDetailsViewModel); 
} 

foreach (var referralStatusHistory in referral.App_ReferralStatusHistory) 
{ 
    timelineDetailsViewModel.EventDate = referralStatusHistory.DateChanged; 
    timelineDetailsViewModel.EventType = "Referral Status Changed: " + referralStatusHistory.Ref_ReferralStatus.Description; 
    timelineDetailsViewModel.EventDescription = referralStatusHistory.Ref_ReferralStatusReason.Description; 

    viewModel.TimeLineList.Add(timelineDetailsViewModel); 
} 

このすべては簡単であるべきであり、オブジェクトのリストを構築するために、ループのそれぞれに各項目を追加する必要があります。問題はそれがそれをしていないということです。私は実際にそれが何をしているのか分かりません。私がループをデバッグして実行するとき、本当に変なものをやっています。私は参照のためにループのコード行に番号を付けました。 1行目を通過し、2行目、1行目、3行目、2行目、4行目などのループを繰り返し実行します。行の後ろのループをまっすぐに実行するのではなく、明白な理由です。

最終的に、TimeLineListにtimelineDetailsViewModelを追加します。次に、次の項目のループを再開しますが、TimeLineListにTimeLineListを追加すると、TimeLineListのカウントは0になり、2行目にジャンプしてから再び4に戻り、次に項目を追加します。リストに追加されていますが、以前にリストに追加されたすべてのアイテムを上書きして、リスト内のすべてのtimelineDetailsViewModelアイテムが最新の追加アイテムと同じになるようにします。したがって、2番目のforeachループの最後まで来るまでに、私のコードでは、7つの固有のtimelineDetailsViewModel項目がリストにあります。すべての項目が異なっています.7つの項目になりますが、すべて同じです。 last timelineDetailsView 2番目のforeachループの最後のループで追加されたモデル。

ここで何が起こっているのか誰も知りませんか?ビジュアルスタジオは壊れていますか私は自分のマシンで再起動を試みたが役に立たなかった。

あなたは一度だけTimeLineListViewModelTimelineDetailsViewModelのインスタンスを作成している:私は、それは奇妙なデバッガの動作を説明していませんが、あなたが実際にあなたのコード内の別のバグを持っているのVisual Studioに2012

+4

は、一度に多くのその1つのスレッドでこれを実行していますか? – stuartd

+0

私には分かりませんが、どうすればそれを見つけることができますか?私は決してスレッドに関係する設定に触れたことはありません、私は通常のようにアプリケーションを実行しており、これをやっています。複数のスレッドで動作させるために何かをやったことがありますか? – necrofish666

+1

出力ログを見て、 "First chance exception"のインスタンスを取得しているかどうかを確認してください。私の推測では、実際には起こっていないキャスト例外デバッガを中断させます。私があなたが何を記述するかのような奇妙なことを見たときに学んだのは、それらのばかげた "ファーストチャンスの例外"のためです。 – Taegost

答えて

4

を使用しています。次に、foreachループを繰り返し、常に正確に同じインスタンスのプロパティを変更します。

ループを実行するたびに、という唯一のインスタンスのプロパティが変更され、このインスタンスをリストにx回追加しようとします。

あなたは中にあなたforeachループをインスタンスを作成する必要があります。

foreach (var referralDiaryEvent in referralDiaryEvents) 
{ 
    // create a NEW instance for every event! 
    var timelineDetailsViewModel = new TimelineDetailsViewModel(); 

    timelineDetailsViewModel.EventDate = referralDiaryEvent.App_DiaryEvent.EventDateTimeScheduled; 
    timelineDetailsViewModel.EventType = referralDiaryEvent.App_DiaryEvent.Ref_EventType.Description; 
    timelineDetailsViewModel.EventDescription = referralDiaryEvent.App_DiaryEvent.EventName; 

    viewModel.TimeLineList.Add(timelineDetailsViewModel); 
} 
+0

ありがとう、これは問題を実際に修正しました。オブジェクトの同じインスタンスを使用して、VSのフリークを作成していたはずです。 – necrofish666

関連する問題