我有例如周一,周四和周日作为抽奖日期。什么是找到最接近的dayOfWeek到Datetime的方法。现在与Linq Lambda?我用正常功能完成了这项工作,但我想知道如何用Linq Lambda做到这一点?
我的方法示例:
public static DateTime GetSoonestDrawDate(this DateTime from, IEnumerable<LotteryDrawDate> drawDates)
{
int hour = 0;
int minute = 0;
bool todayDrawOnly = true;
int difference = 7;
int tempDifference = 0;
int todayDay = (int)from.DayOfWeek;
int drawCutOffDay = 0;
if (todayDay == 0)
{
todayDay = 7;
}
var tempCutOffTime = new TimeSpan(23, 59, 59);
foreach (var drawDate in drawDates)
{
// DayId is DayOfWeek
drawCutOffDay = drawDate.DayId;
if (drawCutOffDay < todayDay)
{
drawCutOffDay += 7;
}
tempDifference = drawCutOffDay - todayDay;
var cutOffTime = new TimeSpan();
cutOffTime = TimeSpan.Parse(drawDate.CutOffTime);
if ((difference > tempDifference) || difference == 0)
{
// draw date is not today
if (tempDifference != 0)
{
difference = tempDifference;
hour = cutOffTime.Hours;
minute = cutOffTime.Minutes;
todayDrawOnly = false;
}
// same day, cutOffTime still available
if ((tempDifference == 0 && cutOffTime > from.TimeOfDay))
{
// we use tempCutOffTime to compare newest cutOffTime in case we have more cutOffTimes on the same day
// in that case we have to select the soonest cutOffTime of the day
if (cutOffTime < tempCutOffTime)
{
difference = tempDifference;
hour = cutOffTime.Hours;
minute = cutOffTime.Minutes;
todayDrawOnly = true;
tempCutOffTime = cutOffTime;
}
}
// same day selected only, but cutOffTime passed, so we add another week only in case there is only one draw date and draw date is on the same day
else if (tempDifference == 0 && cutOffTime < from.TimeOfDay && todayDrawOnly == true)
{
if (cutOffTime < tempCutOffTime)
{
difference = 7;
hour = cutOffTime.Hours;
minute = cutOffTime.Minutes;
todayDrawOnly = true;
tempCutOffTime = cutOffTime;
}
}
}
}
from = from.AddDays(difference);
DateTime soonest = new DateTime(from.Year, from.Month, from.Day, hour, minute, 0);
return soonest;
}
答案 0 :(得分:1)
因为您没有显示LotteryDrawDate
的样子,所以我只使用DayOfWeek
准备了一些示例。你必须扩展它来看你自己的时间部分。
public static DateTime GetSoonestDrawDate(this DateTime from, IEnumerable<DayOfWeek> drawDates)
{
var realDrawDates = drawDates.SelectMany(x => new[] { (int)x, (int)x + 7 }).OrderBy(x => x);
var difference = realDrawDates.SkipWhile(x => x < (int)from.DayOfWeek).First() - (int)from.DayOfWeek;
return from.AddDays(difference);
}
小测试代码:
var drawDates = new[] { DayOfWeek.Monday, DayOfWeek.Wednesday, DayOfWeek.Saturday };
for (int i = 0; i < 15; i++)
{
var from = DateTime.Now.AddDays(i);
Console.WriteLine("{0} - {1}", from.ToShortDateString(), GetSoonestDrawDate(from, drawDates).ToShortDateString());
}
打印( from - next ):
11/18/2013 - 11/18/2013
11/19/2013 - 11/20/2013
11/20/2013 - 11/20/2013
11/21/2013 - 11/23/2013
11/22/2013 - 11/23/2013
11/23/2013 - 11/23/2013
11/24/2013 - 11/25/2013
11/25/2013 - 11/25/2013
11/26/2013 - 11/27/2013
11/27/2013 - 11/27/2013
11/28/2013 - 11/30/2013
11/29/2013 - 11/30/2013
11/30/2013 - 11/30/2013
12/1/2013 - 12/2/2013
12/2/2013 - 12/2/2013
答案 1 :(得分:0)
如果你想要一个简单的硬编码抽奖日列表,你可以这样做:
DateTime GetNextDate(DateTime from)
{
DayOfWeek target;
switch (from.DayOfWeek)
{
case DayOfWeek.Friday:
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
target = DayOfWeek.Sunday;
break;
case DayOfWeek.Monday:
target = DayOfWeek.Monday;
break;
case DayOfWeek.Tuesday:
case DayOfWeek.Wednesday:
case DayOfWeek.Thursday:
target = DayOfWeek.Thursday;
break;
default:
throw new ArgumentException("from");
}
while (from.DayOfWeek != target)
from = from.AddDays(1);
return from;
}
答案 2 :(得分:0)
查找未来最近一天的简单方法如下:
DayOfWeek[] draw_days = { DayOfWeek.Sunday, DayOfWeek.Monday, DayOfWeek.Thursday };
Console.WriteLine(
"Nearest Draw Date: {0}",
draw_days.Min(d => (d <= DateTime.Now.DayOfWeek) ? (d + 7) : d)
);