C #: объединение для (каждого) цикла в эффективный код - PullRequest
1 голос
/ 24 ноября 2011

Это часть моего кода расписания

Два вопроса:

  1. Как я могу предотвратить необходимость обходить время, а затем бронировать номера, чтобы проверить, существует ли оно в заданном временном интервале. Есть ли способ просто сказать "на этот раз, есть ли совпадения из этого списка и каков его идентификатор"

  2. В любом случае, я могу установить внешний td для класса bgred, а не span. (Обратите внимание, что во временном интервале может быть несколько бронирований, следовательно, 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>

     }

Ответы [ 3 ]

2 голосов
/ 24 ноября 2011

Как насчет этого

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

Так что вы можете удалить свой первый цикл for

1 голос
/ 24 ноября 2011

Попробуйте что-то вроде этого.

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

То, что это делает, это проходит через только он

1 голос
/ 24 ноября 2011

Вы должны фильтровать свои данные в контроллере и только передавать соответствующие данные в представление.

Вы можете использовать linq для объектов в контроллере или даже лучше фильтровать данные в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...