我有一个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;
感谢任何帮助。
答案 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.Today
将TimeOfDay
。这就是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;,这将很难失败。如果应该更优雅地处理,请检查您是否在数组的范围内。