如果Condition为true,则返回数组中的下一个值

时间:2016-03-21 13:52:10

标签: c# arrays asp.net-mvc loops

我有一个DateTimes数组:

public DateTime GetNextGame()
{
    DateTime[] dateTimes = new DateTime[]
    {
        new DateTime(2016, 4, 11, 7, 5, 0),
        new DateTime(2016, 4, 12, 7, 5, 0),
        new DateTime(2016, 4, 13, 7, 5, 0),
        new DateTime(2016, 5, 30, 7, 5, 0),
        new DateTime(2016, 5, 31, 7, 5, 0),
        new DateTime(2016, 6, 1, 7, 5, 0),
        new DateTime(2016, 6, 2, 7, 5, 0),
        new DateTime(2016, 6, 14, 7, 5, 0),
        new DateTime(2016, 6, 15, 7, 5, 0),
        new DateTime(2016, 6, 16, 7, 5, 0),
        new DateTime(2016, 8, 16, 7, 5, 0),
        new DateTime(2016, 8, 17, 7, 5, 0),
        new DateTime(2016, 9, 12, 7, 5, 0),
        new DateTime(2016, 9, 13, 7, 5, 0),
        new DateTime(2016, 9, 14, 7, 5, 0),
        new DateTime(2016, 9, 19, 7, 5, 0),
        new DateTime(2016, 9, 20, 7, 5, 0),
        new DateTime(2016, 9, 21, 7, 5, 0),
        new DateTime(2016, 9, 22, 7, 5, 0)
    };

我的问题是..如果当前值不符合条件,我如何返回数组中的下一个值?我对此做了一些研究,发现了一个类似的问题,但它是在PHP中,我不明白。

所以我有一个循环遍历数组然后是条件语句:

foreach(DateTime date in dateTimes)
{
    if(date.TimeOfDay < DateTime.Today.TimeOfDay)
    {
        return //next value in array?
    }
}

还尝试将.ToShortDateString.ToShortTimeString一起返回给我的观点。

我希望它看起来像这样......&#34;下一场比赛是3月3日星期一下午7:05&#34;

感谢任何帮助。

8 个答案:

答案 0 :(得分:2)

可以使用Linq SkipWhile运算符:

            DateTime firstValid = dateTimes.SkipWhile(d => d.TimeOfDay < DateTime.Today.TimeOfDay).First();

编辑:只是想提一下,我们假设数组已经按升序排序。

答案 1 :(得分:1)

使用for-loop代替foreach。

for(int i = 0; i < dateTimes.Length; i++)
{
    if(dateTimes[i].TimeOfDay < DateTime.Today.TimeOfDay && i < dateTimes.Length - 1)
    {
        return dateTimes[i + 1];
    }
}

另请注意,您需要通过编写if(i < dateTimes.Length)来检查您是否超出了数组的范围。

您还可以稍微组合循环条件:

for(int i = 0; i < dateTimes.Length - 1; i++)
{
    if(dateTimes[i].TimeOfDay < DateTime.Today.TimeOfDay)
    {
        return dateTimes[i + 1];
    }
}

答案 2 :(得分:1)

你可以做到

update hpl.kamodt C
    set (NRANK, chghlightacces) = 
             (select NRANK, chghlightacces
              from hpl.kamodt as A
                  inner join (
                      select naccesgrpref, NMOD, count(*)
                      from hpl.kamodt
                      where naccesgrpref is not null
                        and NMOD is not null
                      group by naccesgrpref, NMOD
                      having count(naccesgrpref) > 1) B
                  on  A.naccesgrpref = B.naccesgrpref 
                  and A.NMOD = B.NMOD  
                  and A.naccesgrpref = A.NACCES)

或者,如果您想使用return dateTimes.OrderBy(dateTime => dateTime).FirstOrDefault(dateTime => dateTime > DateTime.Now); Today

TimeOfDay

答案 3 :(得分:1)

如果您需要访问下一个(或上一个)项目,则应使用for - 循环:

for(int i = 0; i < dateTimes.Length - 1; i++)
{
    (dateTimes[i].TimeOfDay < DateTime.Today.TimeOfDay)
    {
        return dateTimes[i + 1];
    }
}

除此之外,你的比较毫无意义:

if(date.TimeOfDay < DateTime.Today.TimeOfDay)
{
    // this will never be true
}

DateTime.TimeOfDay会返回TimeSpan的{​​{1}},因此会返回时间组件。 DateTime今天午夜返回,因此DateTime.TodayTimeOfDay。这就是TimeSpan.Zero永远不会成真的原因。

我假设您希望第一个date.TimeOfDay < DateTime.Today.TimeOfDay日期在今天之前。然后使用:

DateTime

答案 4 :(得分:1)

尝试使用if(date.Date < DateTime.Today) { // ... } 循环代替for

foreach

答案 5 :(得分:1)

如果由于某些原因,您不想使用for循环,请尝试以下操作:

int counter = 0;
foreach(DateTime date in dateTimes)
{
    if(date.TimeOfDay < DateTime.Today.TimeOfDay)
    {
        return dateTimes[counter + 1];
    }
    counter++;
}

答案 6 :(得分:1)

你可以尝试:

foreach(DateTime date in dateTimes)
{
    if(!(date.TimeOfDay < DateTime.Today.TimeOfDay))
    {
        continue;
    }
    return date;
}

答案 7 :(得分:1)

如果您事先知道阵列已完全排序,请使用:

var idx = Array.BinarySearch(dateTimes, DateTime.Now);

return dateTimes[idx >= 0 ? idx : ~idx];

像这里的许多其他解决方案一样,如果没有即将到来的&#34;下一场比赛&#34;,这将很难失败。如果应该更优雅地处理,请检查您是否在数组的范围内。