6

時間範囲のリストを作成する方法はありますか? 例: 次を含むリスト: 12:00 から 1:00 pm 1:00 から 2:00 pm など... 分割セクションは構成です。datetime を使用して、それを特定の数 (この場合は 1 時間) に分割する必要があると思います

誰かが私を正しい方向に向けるか、例を教えてください。

前もって感謝します!

4

1 に答える 1

8

時間範囲を定義する組み込み型はありませんが、 aDateTimeと aを組み合わせて作成するのは非常に簡単TimeSpanです。例えば:

struct TimeRange
{
    private readonly DateTime start;
    private readonly TimeSpan duration;

    public TimeRange ( DateTime start, TimeSpan duration )
    {
        this.start = start;
        this.duration = duration;
    }
}

次に、開始点としてList<TimeRange>特定のものを使用し、各要素に必要なものを追加して を構築できます。たとえば、サブ範囲の現在および必要な期間に基づいてを返す、呼び出されたメソッドを含む非常に基本的な実装を次に示します。DateTimeTimeSpanTimeRangeSplitIEnumerable<TimeRange>TimeRange

struct TimeRange
{
    private readonly DateTime start;
    private readonly TimeSpan duration;

    public TimeRange ( DateTime start, TimeSpan duration )
    {
        this.start = start;
        this.duration = duration;
    }

    public DateTime From { get { return start; } }

    public DateTime To { get { return start + duration; } }

    public TimeSpan Duration { get { return duration; } }

    public IEnumerable<TimeRange> Split (TimeSpan subDuration)
    {
        for (DateTime subRangeStart = From; subRangeStart < this.To; subRangeStart += subDuration)
        {
            yield return new TimeRange(subRangeStart, subDuration);
        }
    }

    public override string ToString()
    {
        return String.Format ("{0} -> {1}", From, To);
    }
}

次に、次のようなことができます。

TimeRange mainRange = new TimeRange(DateTime.Now, new TimeSpan(12, 0, 0));
List<TimeRange> rangeList = mainRange.Split(new TimeSpan(1, 0, 0)).ToList();

これにより、現在の時刻から始まる 1 時間の 12 の時間範囲のリストが表示されます。

** アップデート **

上記の実装は非常に基本的なものであることに注意してください。たとえば、このSplitメソッドは、サブ期間が親範囲の整数分割でない場合、最後のサブ範囲の終わりが親範囲の終わりを超えている場合に、喜んで一連の範囲を生成します。ただし、この種のチェックを追加するのは難しいでしょう。本当の問題は、そのようなシナリオで何をしたいかです。

明示的な親範囲を必要とせずにTimeRange.CreateListを構築する静的メソッドを作成することも非常に簡単です。List<TimeRange>

于 2012-07-23T02:49:59.833 に答える