Foreach循环在第一次出现时停止

时间:2017-08-09 11:54:20

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我创建了一个for each循环,在此我检查预定是否在特定滑雪板上保留,以及DateTime.Now是否在预订日期之内。如果是,则IsReserved属性设置为true

这很完美,所以我可以保留一个项目。现在我正在弄清楚如果保留被删除,如何处理这种情况。我想在特定项目上将IsReserved属性设置为false,如果其中的预订已被删除。

这是循环

foreach (Ski s in skies)
{

    foreach (Reservation r in reservations) 
    {
        var datumdo1 = r.DateTo;
        var datumdo2 = datumdo1.ToShortDateString();
        var datumted1 = DateTime.Now;
        var datumted2 = datumted1.ToShortDateString();
        var datumod1 = r.DateFrom;
        var datumod2 = datumod1.ToShortDateString();

        if ((s.Id == r.Reserved.Id && (r.DateFrom < DateTime.Now || datumod2 == datumted2)) && (r.DateTo > DateTime.Now || datumdo2 == datumted2) && (r.Reserved.IsReserved == false)) 
        {
            s.IsReserved = true;
        }

    skiDao.update(s);

    }

    if(reservations.Count == 0)
    {
        s.IsReserved = false;
    }

}

我尝试在第一个条件下添加它:

if(s.Id != r.Reserved.Id)
{
s.IsReserved = false;
}

但是,迭代会在第一次出现时停止。所以它只检查一个预订。如果没有与项目ID相同的ID,如何通过所有预订并设置s.IsReserved = false

3 个答案:

答案 0 :(得分:0)

试试这个,

foreach (Ski s in skies)
{
     var reser = reservations.where(a=>a.ReservedId == s.Id).firstordefault(); 
     if(reser != null) // cheks if no reservation available
     {
        s.IsReserved = false;
     }
     else{
          // if you need
     }
}

答案 1 :(得分:0)

我在这里提出你最初的想法。我认为你的建议在哪里会重置s.IsReserved在第一个不匹配的ID(这可能只是意味着它不是你看到的第一个),而不是它们都不匹配(预订被删除)。你可以这样做。

foreach (Ski s in skies)
{
    var skiFound = false;    
foreach (Reservation r in reservations) 
{
    skiFound = skiFound || (s.Id == r.Reserved.Id);
    var datumdo1 = r.DateTo;
    var datumdo2 = datumdo1.ToShortDateString();
    var datumted1 = DateTime.Now;
    var datumted2 = datumted1.ToShortDateString();
    var datumod1 = r.DateFrom;
    var datumod2 = datumod1.ToShortDateString();

    if ((s.Id == r.Reserved.Id && (r.DateFrom < DateTime.Now || datumod2 == datumted2)) && (r.DateTo > DateTime.Now || datumdo2 == datumted2) && (r.Reserved.IsReserved == false)) 
    {
        s.IsReserved = true;
    }

skiDao.update(s);

}
if (!skiFound)
{
    s.IsReserved = false;
}

//now probably no longer needed
    if(reservations.Count == 0)
    {
        s.IsReserved = false;
    }

//commenters may well be right that for this change to stick, you need to update the database

}

答案 2 :(得分:-2)

您可以使用LINQ

,而不是预订
s.IsReserved = reservations.Any(r => (s.Id == r.Reserved.Id && (r.DateFrom < DateTime.Now || datumod2 == datumted2)) && (r.DateTo > DateTime.Now || datumdo2 == datumted2) && (r.Reserved.IsReserved == false));

这将取代整个循环和最后一个条件。

相关问题