2012-05-09 47 views
1

我是MVC/Razor的新手,我需要一點方向。我正在嘗試創建從MongoDB數據庫檢索日期的培訓日曆。我在下面的解決方案的工作,但看看它,我知道它可以更有效地完成,並希望一些指針。c#mvc3 razor - 替代foreach循環匹配模型中的列表項目

這是我的頁面上的div的代碼,這是一個月中的某一天......我在頁面上有四個月。 Model.TrainingDaysList<TrainingEvent> TEvent。一個TrainingEvent實例具有以下屬性:

string CssClass 
string EventName 

這裏是我的剃刀代碼(其中_day爲我們呈現了每月天數:

如果該TrainingEvent日期符合當前_day如果我有很多事件,foreach循環並不是最好的辦法。 如何應該我正在做這個嗎?這也是我的首先發布,所以任何意見如何我問這個問題表示讚賞。 非常感謝! 添

+1

爲什麼foreach循環不是最好的方法,如果你有很多事件? – taylonr

+0

爲什麼這麼糟糕?它在我的應用程序內運行良好,循環了數千個項目,而且性能沒有開銷。 –

+0

@taylonr:我同意你的看法。 –

回答

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

+1但值得一提的是,你並沒有用這個消除循環,你只是將它隱藏在方法調用的後面。 – MattDavey

+0

@MattDavey:你說的對,但是過濾必須完成的地方...... – Mithrandir

+0

Mithrandir,你的例子只是迭代匹配事件日期而不是整個日期列表?如果是這樣,我認爲這是一個很好的解決方案 –

1

你可以按日期的TrainingDays,然後將其轉換爲一個字典,如果你真的關心性能的下降。我不知道剃刀語法它,但你會做這在普通的C#:

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

然後,你可以只是仰望這一天的項目做:

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

這你只需一次遍歷整個TrainingDays的集合,並且每天只觸摸你需要的特定對象。除非你有一個巨大的數據集,然而,這個差異將會被忽略。

+0

這也給了我一個'不能使用lambda表達式作爲參數的動態調度操作,而不首先將其轉換爲委託或表達式樹型錯誤 - 我錯過了什麼嗎?我已經添加了'system.data.linq'引用我的項目和視圖文件夾 –

+0

我不太清楚,正如我所說,我不太熟悉MVC,你可以在控制器中進行分組,然後將它放在ViewBag中,而不是最優雅的解決方案,但值得一試。 –