2011-11-24 57 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