我有一系列的假期日期。这些总是平日。让我们说
DateTime[] dates = new DateTime[] {"1/8/2010","1/3/2010","1/6/2010","1/7/2010","1/21/2010"}
我现在只有一个输入日期。让我们说:
DateTime vacationDateToCheck = 1/7/2010;
我想找到上面给出的假期集(日期列表)。特别是,我想要列表的第一个和最后一个日期。
例如,如果我传递vacationDateToCheck变量(2010年7月7日),我会回来
是的,您将于2010年6月1日至2010年1月8日度假。
如果我在2010年1月4日通过,它将返回一个空的结果。
这是踢球者。我想让它考虑到周末和周末。因此,如果我在星期五和下一个星期一休假,我希望将其列为一个清单。
有什么建议吗?
答案 0 :(得分:3)
首先,您必须对数组进行排序,或者至少制作一个已排序的副本,如果将顺序保留在原始列表中这一点非常重要。如果你不这样做,那就不容易了。
然后,找到您要检查的元素的索引。完成后,创建一个前进循环,然后在数组中向后循环,如果两个日期是连续的,则计算你在循环中到达的日期;否则,停止该循环(如果你还没有这样做,则执行另一个循环)。
这假设您可以在列表中找到您正在寻找的所有天,包括周末和假日。
编辑:如果你想隐含地包括周末,你必须在迭代这些日子时使用DayOfWeek检查工作日。最简单的方法是在下一个预期的日子里维护一个变量;在循环中的每次迭代中,您可以在一天内添加(或减去,当向后移动已排序的数组时)。如果您正在处理的那一天是星期五(或向后移动的星期一),请加上/减去额外的2天以跳过周末。
这是基本想法(未经过测试,但您应该明白这一点)。我假设您已经对dates
进行了排序,并且您已在数组中找到了初始日期(在索引i
处)。为简单起见,我还假设vacationDateToCheck
永远不是周六或周日;如果它可以是其中之一,你将不得不相应调整。
DateTime expectedDate = vacationDateToCheck.AddDays(1);
if (vacationDateToCheck.DayOfWeek == DayOfWeek.Friday)
expectedDate = expectedDate.AddDays(2);
DateTime startDate = vacationDateToCheck;
DateTime endDate = vacationDateToCheck;
for (int j = i + 1; i < dates.Length; i++) {
if (dates[i] == expectedDate) {
endDate = dates[i];
expectedDate = dates[i].AddDays(1);
if (dates[i].DayOfWeek == DayOfWeek.Friday)
expectedDate = expectedDate.AddDays(2);
}
else
{
break;
}
}
迭代另一种方式是相似的,只有你添加-1和-2天,并检查一周中的某一天是星期一。