c#mvc3 razor - 匹配模型中List项的foreach循环的替代方法

时间:2012-05-09 12:57:54

标签: c# asp.net-mvc-3 razor

我是MVC / Razor的新手,我需要一点方向。我正在尝试创建从MongoDB数据库中检索日期的培训日历。我下面的解决方案有效,但看着它,我知道它可以更高效地完成,并且想要一些指针。

以下是我页面上div的代码,即每月的一天...我在页面上有四个月的时间。 Model.TrainingDaysList<TrainingEvent> TEventTrainingEvent实例具有以下属性:

string CssClass
string EventName

这是我的剃刀代码(其中_day是我们呈现的月份的日期:

<div class="day">
    <div class="dayBox">@_dayNumber.ToString("00") <span class="black">@_day.ToString("ddd")</span></div>

    @foreach (var item in Model.TrainingDays)
    {
        if (_day.Date == item.Date.Date)
        {
            string eventCls = "eDay " + item.TEvent.CssClass;
            <div class="@eventCls">@item.TEvent.EventName</div>
            break;
        }
    }
</div>

如果TrainingEvent的日期与我们所在的当前_day div匹配,请添加事件。如果我有很多事件,foreach循环不是最好的方法。 我应该如何 这样做?这也是我的第一篇帖子,所以对我如何提出这个问题的任何建议都表示赞赏。 非常感谢! 蒂姆

2 个答案:

答案 0 :(得分:3)

尝试这样的事情:

<div class="day">
    <div class="dayBox">@_dayNumber.ToString("00") <span class="black">@_day.ToString("ddd")</span></div>

    @foreach (var item in Model.TrainingDays.Where( td => td.Date.Date == _day.Date ))
    {
            string eventCls = "eDay " + item.TEvent.CssClass;
            <div class="@eventCls">@item.TEvent.EventName</div>
            break;
    }
</div>

答案 1 :(得分:1)

您可以按日期对TrainingDays进行分组,然后如果您真的担心性能损失,则将它们转换为字典。我不确定它的Razor语法,但你会在普通的C#中执行此操作:

var trainingDaysByDay = Model.TrainingDays
    .GroupBy(td => td.Date.Date)
    .ToDictionary(g => g.Key);

然后您可以通过以下方式查找当天的项目:

foreach(var item in trainingDaysByDay[_day.Date])
{
    //...
}

这样,您只需遍历整个TrainingDays集合一次,并且每天只触摸您需要的特定对象。但是,除非您拥有庞大的数据集,否则差异可以忽略不计。