6

私は現在、多数の時間範囲を組み合わせる必要があるC#プログラムに取り組んでいます。範囲ごとに、開始時刻と終了時刻があります。これがRubyで行われているが、C#では行われていない例を見つけました。私は基本的に時間範囲の結合を探しています。linqを使用してこれを行う方法があるかもしれないと思いますが、私はそれを思い付くことができません。何か案は?

だから例えば

開始時間:1:30終了時間:2:00

開始時間:1:45終了時間:2:30

開始時間:3:00終了時間:5:00

開始時間:4:00終了時間:4:30

開始時間:4:45終了時間:5:30

この一連の時間は次のように戻ってきます

開始時間:1:30終了時間:2:30

開始時間:3:00終了時間:5:30

4

3 に答える 3

8

TimeRanges交差点メソッドをサポートするこのプロジェクトを見ることができます:

http://www.codeproject.com/Articles/168662/Time-Period-Library-for-NET

ここに画像の説明を入力

于 2012-10-29T21:54:45.317 に答える
6

これは面白そうだったので、何かコーディングを始めました。

public class TimeRanges
{
    private List<TimeRange> _mergedTimeRanges = new List<TimeRange>();

    public void Add(TimeRange timeRange)
    {
        if(!_mergedTimeRanges.Any(x=>x.IsOverLap(timeRange)))
        {
            _mergedTimeRanges.Add(timeRange);
            return;
        }
        while (_mergedTimeRanges.Any(x => x.IsOverLap(timeRange) && x!=timeRange))
        {
            TimeRange toMergeRange = _mergedTimeRanges.First(x => x.IsOverLap(timeRange));
            toMergeRange.Merge(timeRange);
            timeRange = toMergeRange;
        }
    }

    public IEnumerable<TimeRange> GetMergedRanges()
    {
        return _mergedTimeRanges;
    }
}
public class TimeRange
{
    public DateTime Start { get; private set; }
    public DateTime End { get; private set; }
    public TimeRange(DateTime start, DateTime end)
    {
        if (start >= end)
            throw new ArgumentException("Invalid time range, end must be later than start");
        Start = start;
        End = end;
    }

    public void Merge(TimeRange timeRange)
    {
        if (!IsOverLap(timeRange))
            throw new ArgumentException("Cannot merge timeranges that don't overlap", "timeRange");
        if (End < timeRange.End)
            End = timeRange.End;
        if (timeRange.Start < Start)
            Start = timeRange.Start;
    }

    public bool IsOverLap(TimeRange timeRange)
    {
        if (timeRange.End < Start)
            return false;
        if (timeRange.Start > End)
            return false;
        return true;
    }

    public bool Equals(TimeRange other)
    {
        if (ReferenceEquals(null, other)) return false;
        if (ReferenceEquals(this, other)) return true;
        return other.Start.Equals(Start) && other.End.Equals(End);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != typeof (TimeRange)) return false;
        return Equals((TimeRange) obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            return (Start.GetHashCode()*397) ^ End.GetHashCode();
        }
    }
}

誰かが興味を持っているなら、私はそれについていくつかのテストを持っています

于 2012-10-29T23:06:51.103 に答える