日付がDateRangeの間にあるかどうかを知る必要があります。私には3つの日付があります:
// The date range
DateTime startDate;
DateTime endDate;
DateTime dateToCheck;
簡単な解決策は比較を行うことですが、これを行うためのよりスマートな方法はありますか?
日付がDateRangeの間にあるかどうかを知る必要があります。私には3つの日付があります:
// The date range
DateTime startDate;
DateTime endDate;
DateTime dateToCheck;
簡単な解決策は比較を行うことですが、これを行うためのよりスマートな方法はありますか?
いいえ、簡単な比較を行うことは私には良さそうです:
return dateToCheck >= startDate && dateToCheck < endDate;
しかし、考えるべきこと:
DateTimeタイムゾーンの点でやや奇妙なタイプです。それはUTCである可能性があり、「ローカル」である可能性があり、あいまいである可能性があります。リンゴとリンゴを比較していることを確認してください。通常、私はそのようなもののためにファウラーの範囲の実装を作成します。
public interface IRange<T>
{
T Start { get; }
T End { get; }
bool Includes(T value);
bool Includes(IRange<T> range);
}
public class DateRange : IRange<DateTime>
{
public DateRange(DateTime start, DateTime end)
{
Start = start;
End = end;
}
public DateTime Start { get; private set; }
public DateTime End { get; private set; }
public bool Includes(DateTime value)
{
return (Start <= value) && (value <= End);
}
public bool Includes(IRange<DateTime> range)
{
return (Start <= range.Start) && (range.End <= End);
}
}
使用法は非常に簡単です:
DateRange range = new DateRange(startDate, endDate);
range.Includes(date)
拡張メソッドを使用して、もう少し読みやすくすることができます。
public static class DateTimeExtensions
{
public static bool InRange(this DateTime dateToCheck, DateTime startDate, DateTime endDate)
{
return dateToCheck >= startDate && dateToCheck < endDate;
}
}
今、あなたは書くことができます:
dateToCheck.InRange(startDate, endDate)
次を使用できます。
return (dateTocheck >= startDate && dateToCheck <= endDate);
次のライブラリは、あらゆる種類の日付計算を行うときに最も役立つことがわかりました。これが.Netフレームワークの一部であることに私はまだ驚いていません。
http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET
Sergeyの回答に続いて、このより一般的なバージョンはFowlerのアイデアに沿ったものであり、として制約することで一般的なクラス内Rangeにメソッドを含めることができるなど、その回答に関するいくつかの問題を解決すると思います。また、などの他の値型の機能を拡張する型で期待されるものと同様に不変です。IncludesTIComparable<T>DateTime
public struct Range<T> where T : IComparable<T>
{
public Range(T start, T end)
{
Start = start;
End = end;
}
public T Start { get; }
public T End { get; }
public bool Includes(T value) => Start.CompareTo(value) <= 0 && End.CompareTo(value) >= 0;
public bool Includes(Range<T> range) => Start.CompareTo(range.Start) <= 0 && End.CompareTo(range.End) >= 0;
}