2011-11-24 22 views
1

這是C#:對於(每個)結合循環,以高效的代碼

兩個問題我的時間表代碼的一部分:

  1. 如何防止通過時間有循環,然後roombookings檢查它是否存在於給定的時隙中。有沒有一種方法只是說「現在這個列表中有匹配項,它的ID是什麼」

  2. 是否有反正我可以設置外部td到班級bgred,而不是一個跨度。 (請注意,有可能是一個時隙中的多個訂單,因此具有TD走出foreach循環。)

<tr> 
    <th></th> 

     @for (int i = 9; i <= 17; i++) 
     { 
     <th>@i:00</th> 
     } 
</tr> 

    @foreach (var RoomNo in ViewBag.Rooms)  
    { 

     <tr> 

      <th>@RoomNo</th> 

      @for (int i = 9; i <= 17; i++) 
      { 
       <td> 
       @foreach (var roombooking in ViewBag.RoomBookings) 
       { 
        DateTime DateCheckStart = DateTime.Parse(ViewBag.Date.ToShortDateString() + " " + i.ToString() + ":00"); 
        DateTime DateCheckEnd = DateTime.Parse(ViewBag.Date.ToShortDateString() + " " + i.ToString() + ":59"); 
        if (DateCheckStart < roombooking.EndDateTime && DateCheckEnd > roombooking.StartDateTime && roombooking.RoomNo == RoomNo) 
        { 
        <span class="bgred"> @roombooking.RentalNo</span> 
        } 
       } 
       </td> 
      } 
     </tr> 

    } 

回答

1

嘗試類似這樣的事情。

<table> 
<tr> 
    <th></th> 

     @for (int i = 9; i <= 17; i++) 
     { 
     <th>@i:00</th> 
     } 
</tr> 

@{ List<MyLibrary.MyRoomOccupancy> RoomBookingsTemp = ViewBag.RoomBookings;} 

@foreach (var RoomNo in ViewBag.Rooms) 
{ 
    <tr> 
     <th>@RoomNo</th> 

     @for (int i = 9; i <= 17; i++) 
     {    
      DateTime DateCheckStart = DateTime.Parse(ViewBag.Date.ToShortDateString() + " " + i.ToString() + ":00"); 
      DateTime DateCheckEnd = DateTime.Parse(ViewBag.Date.ToShortDateString() + " " + i.ToString() + ":59"); 

      var sublist = (from RoomOcc in RoomBookingsTemp where DateCheckStart < RoomOcc.EndDateTime && DateCheckEnd > RoomOcc.StartDateTime && RoomOcc.RoomNo == RoomNo select RoomOcc); 


      if (sublist.Count() > 0) 
      { 
       @Html.Raw("<td class= \"bgred\">"); 

      } 
      else { 
       Html.Raw("<td>"); 
      } 

      foreach (var roombooking in sublist) 
      { 
       if (DateCheckStart < roombooking.EndDateTime && DateCheckEnd > roombooking.StartDateTime && roombooking.RoomNo == RoomNo) 
       { 
        @roombooking.RentalNo 
       } 
      } 
      @Html.Raw("</td>"); 

     } 
    </tr> 

} 


</table> 

這樣做是它遍歷onlyt他

+0

OOO。 TH不刪除for,但它基本上做了類似的事情,我不必循環整個數據列表。因此顯着減少計算!它解決了td課程的問題! Genious我的朋友!感謝那。您的描述缺失。 :) – Doomsknight

+0

你的代碼在MVC3環境中不起作用。使用這個概念我試圖創造相同的效果。 – Doomsknight

+0

對不起,我沒有測試它,我只是大部分猜測。我會讓你修復我的語法錯誤:P –

2

什麼像這樣

@foreach (var roombooking in ViewBag.RoomBookings.Where(/* in range */)) 

所以你可以刪除你的第一個for循環

+0

但隨後又怎麼會知道什麼表格單元格是在尋找?即哪個時間段。 foreach Room每次定義表格,然後循環遍歷數據的不必要循環? – Doomsknight

+0

儘管你沒有使用任何東西,除了你看到它是否在範圍之內。並且你沒有將時隙id傳遞給html。 –

+0

我的錯,我離開了代碼中的表頭。我的每個循環創建一個新的TD,在相關時隙下插槽。 – Doomsknight

1

你應該過濾控制器中的數據,只有通過相關數據的觀點。

您可以將linq用於控制器中的對象,甚至可以更好地過濾數據庫中的數據。

+0

我想在相關的插槽中顯示它。如果我事先過濾它,所有的數據將不會是可用的 – Doomsknight