[英]c# mvc3 razor - alternatives to foreach loop on matching List items in Model
我是MVC / Razor的新手,我需要一点方向。 我正在尝试创建从MongoDB数据库中检索日期的培训日历。 我下面的解决方案有效,但看着它,我知道它可以更高效地完成,并且想要一些指针。
这是我页面上div的代码,即每月的一天......我在页面上有四个月的时间。 Model.TrainingDays
是List<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.