@Bradのポイントは、曜日が任意の2日間の間にあるという点が有効です。ただし、問題の週の2日が注文されていると想定しています。
つまり、「2010年10月30日(土曜日)は金曜日と日曜日の間にあるのでしょうか?」ということです。、私たちは本当に「2010年10月30日は金曜日、土曜日、または日曜日のいずれかですか?」と尋ねています。。
この観察により、問題を2つのコンポーネントに分解し、問題全体を簡単に解決できます。
1)特定の曜日が特定の曜日のセットの1つであるかどうかを判別します(これは些細なことです)。
2)ある日から別の日に移動する曜日のセットを決定します。つまり、「Friday」と「Sunday」を指定すると「Friday、Saturday、Sunday」を返し、「Monday」と「Friday」を指定すると「Monday、Tuesday、Wednesday、Thursday、Friday」を返す関数が必要です。これは問題のトリッキーな部分です。
2番目の問題を解決するために、私たちは基本的に1日目から2日目まで歩き、その間のすべての日を返します。これを正しく行うには、2日目が1日目よりも少ない可能性があるという事実を考慮する必要があります(日曜日=0は金曜日=5よりも少ないという表現の意味で)。したがって、整数空間で「ウォーク」を実行し、1日目よりも小さい場合は2日目に7を追加します。「ウェイアウト」で曜日スペース(7を法とする整数)に変換します。
以下は、これを解決するコードと一連のテストです。「GetDaysBetweenInclusive」メソッドは問題#2を解決し、「IsDayOfWeekBetween」は問題#1に解決策を追加し、OPの問題を解決します。
楽しみ。
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));
}
}
}