什么是查找连续日列表的最快方法

时间:2010-10-14 12:09:30

标签: c# arrays datetime

我有一系列的假期日期。这些总是平日。让我们说

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日通过,它将返回一个空的结果。

这是踢球者。我想让它考虑到周末和周末。因此,如果我在星期五和下一个星期一休假,我希望将其列为一个清单。

有什么建议吗?

1 个答案:

答案 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天,并检查一周中的某一天是星期一。