@ Указание Брэда о том, что любой день недели попадает между любыми двумя днями недели, является действительным.Тем не менее, мы предполагаем, что два дня данной недели заказаны .
То есть, когда мы говорим, "это 30 октября 2010 г. (суббота) между пятницей и воскресеньем?" , мы действительно спрашиваем, "это 30 октября 2010 г.пятница, суббота или воскресенье? ".
Это наблюдение позволяет нам разбить проблему на две составляющие и легко решить ее полностью:
1) Определитьесли определенный день недели является одним из определенного набора дней недели (это тривиально).
2) Определите набор дней недели, которые переносят вас от одного дня к другому.То есть нам нужна функция, которая возвращает «пятница, суббота, воскресенье», когда ей присваивается «пятница» и «воскресенье», и эта функция возвращает «понедельник, вторник, среда, четверг, пятница», когда ей дают «понедельник» и «пятница».Это сложная часть проблемы.
Чтобы решить вторую проблему, мы в основном переходим с первого дня на второй, возвращая все промежуточные дни.Чтобы сделать это правильно, мы должны учитывать тот факт, что второй день может быть меньше первого дня (в репрезентативном смысле воскресенье = 0 меньше пятницы = 5).Итак, мы выполняем «прогулку» в целочисленном пространстве и добавляем 7 ко второму дню, если он меньше первого дня.Мы преобразовываем в число дней недели (то есть целые числа по модулю 7) на «выходе».
Ниже приведен код и серия тестов, которые решают эту проблему.Метод «GetDaysBetweenInclusive» решает проблему № 2, а «IsDayOfWeekBetween» добавляет решение проблемы № 1 и решает проблему ОП.
Наслаждайтесь.
using System;
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
namespace DayOfWeekUtilities
{
public static class DayOfWeekHelpers
{
/// <summary>
/// returns all days of the week, inclusive, from day1 to day2
/// </summary>
public static IEnumerable<DayOfWeek> GetDaysBetweenInclusive(DayOfWeek day1,
DayOfWeek day2)
{
var final = (int)day2;
if(day2 < day1)
{
final += 7;
}
var curr = (int)day1;
do
{
yield return (DayOfWeek) (curr%7);
curr++;
} while (curr <= final);
}
/// <summary>
/// returns true if the provided date falls on a day of the
/// week between day1 and day2, inclusive
/// </summary>
public static bool IsDayOfWeekBetween(this DateTime date,
DayOfWeek day1,
DayOfWeek day2)
{
return GetDaysBetweenInclusive(day1, day2).Contains(date.DayOfWeek);
}
}
[TestFixture]
public class Tests
{
[Test]
public void Test()
{
Assert.IsTrue(new DateTime(2010, 10, 22).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsTrue(new DateTime(2010, 10, 23).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsTrue(new DateTime(2010, 10, 24).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsFalse(new DateTime(2010, 10, 25).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsFalse(new DateTime(2010, 10, 26).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsFalse(new DateTime(2010, 10, 27).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsFalse(new DateTime(2010, 10, 28).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsTrue(new DateTime(2010, 10, 29).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Sunday));
Assert.IsTrue(new DateTime(2010, 10, 22).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 23).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 24).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 25).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 26).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 27).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 28).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 29).IsDayOfWeekBetween(DayOfWeek.Friday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 22).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 23).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsFalse(new DateTime(2010, 10, 24).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 25).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 26).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 27).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 28).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 29).IsDayOfWeekBetween(DayOfWeek.Monday, DayOfWeek.Friday));
Assert.IsTrue(new DateTime(2010, 10, 22).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
Assert.IsTrue(new DateTime(2010, 10, 23).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
Assert.IsTrue(new DateTime(2010, 10, 24).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
Assert.IsTrue(new DateTime(2010, 10, 25).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
Assert.IsTrue(new DateTime(2010, 10, 26).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
Assert.IsFalse(new DateTime(2010, 10, 27).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
Assert.IsTrue(new DateTime(2010, 10, 28).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
Assert.IsTrue(new DateTime(2010, 10, 29).IsDayOfWeekBetween(DayOfWeek.Thursday, DayOfWeek.Tuesday));
}
}
}