繁体   English   中英

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

[英]c# mvc3 razor - alternatives to foreach loop on matching List items in Model

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

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

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匹配,请添加Event。 如果我有很多事件,foreach循环不是最好的方法。 应该怎么做呢? 这也是我的第一篇帖子,所以对我如何提出这个问题的任何建议都表示赞赏。 非常感谢! 蒂姆

尝试这样的事情:

<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>

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

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

那么你可以通过以下方式查找当天的项目:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM