C#foreach语句没有正确地将模型添加到模型列表中

时间:2016-08-10 16:16:23

标签: 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行,依此类推,它在环路中来回跳转显而易见的原因,而不是直接循环,一行一行。

然后最终它会将timelineDetailsViewModel添加到TimeLineList。然后它将再次为下一个项启动循环,但是当它再次将timelineDetailsViewModel添加到TimeLineList时,TimeLineList计数变为0,然后跳回到第2行,然后再返回到4,然后将项添加到列表,但覆盖以前添加到列表中的每个项目,列表中的所有timelineDetailsViewModel项目与最新添加的项目相同。所以当它到达第二个foreach循环的底部时,在我的代码中,列表中应该有七个唯一的timelineDetailsViewModel项目,所有项目都有不同的细节 - 最终会有七个项目,但它们都与在第二个foreach循环的最后一个循环期间添加的最后一个timelineDetailsViewModel。

有人知道这里发生了什么吗?我的视觉工作室坏了吗?我试过在我的机器上重启,但无济于事。我正在使用visual studio 2012。

1 个答案:

答案 0 :(得分:4)

它没有解释奇怪的调试器行为,但实际上您的代码中还有另一个错误:

您只创建了一次TimeLineListViewModelTimelineDetailsViewModel的实例。然后,遍历foreach循环,您始终会更改完全相同实例的属性

在每次循环中,您正在更改您创建的唯一实例的属性,并尝试将此实例x次添加到您的列表中。

您需要在<{1}}循环内

中创建实例 s

foreach