簡體   English   中英

C#:將(每個)循環組合到有效的代碼中

[英]C#: Combining for(each) loops to efficient code

這是我的時間表代碼的一部分

兩個問題:

  1. 如何防止必須遍歷時間,然后檢查房間檢查以檢查它是否存在於給定的時間段內。 有沒有辦法只是說“這個時候,這個列表中是否有匹配,它的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>

     }

這樣的事情呢

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

這樣你就可以刪除你的第一個for循環

您應該在控制器中過濾數據,並僅將相關數據傳遞給視圖。

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

嘗試這樣的事情。

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

這樣做是因為它只能通過他

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM