Какой самый быстрый способ найти список дня подряд - PullRequest
0 голосов
/ 14 октября 2010

У меня есть массив дат отпуска. Это всегда будние дни. Скажем

DateTime[] dates = new DateTime[] {"1/8/2010","1/3/2010","1/6/2010","1/7/2010","1/21/2010"}

Теперь у меня есть одна дата ввода. Скажем:

DateTime vacationDateToCheck = 1/7/2010;

Я хочу найти набор отпусков (список дат), указанный выше. В частности, я хочу первую и последнюю дату списка.

Так, например, если я передам переменную holidayDateToCheck (07.01.2010), я вернусь

Да, вы находитесь в отпуске с 6 января 2010 года по 1 августа 2010 года.

Если я пройду в 1/4/2010, он вернет пустой результат.

Вот кикер. Я хочу, чтобы это учитывало выходные и проходило через выходные. Поэтому, если у меня отпуск в пятницу и следующий понедельник, я бы хотел, чтобы он включил его в один список.

есть предложения?

1 Ответ

3 голосов
/ 14 октября 2010

Во-первых, вам придется отсортировать массив или, по крайней мере, сделать отсортированную копию, если важно сохранить порядок в исходном списке. Если вы этого не сделаете, это не будет легко.

Затем найдите индекс элемента, который вы проверяете. Как только вы это сделаете, создайте цикл, идущий вперед и один назад в вашем массиве, и посчитайте дату, которую вы достигли в цикле, если две даты последовательны; в противном случае остановите этот цикл (и выполните другой цикл, если вы этого еще не сделали).

Это предполагает, что все дней в диапазоне, который вы ищете, можно найти в списке, включая выходные и праздничные дни.

РЕДАКТИРОВАТЬ: Если вы хотите косвенно включить выходные дни, вам нужно будет проверить день недели, используя 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 дня и проверяете, является ли день недели понедельником.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...