0

PeriodBase使用する主なプロパティを含むカスタム クラスがあります。

 public class PeriodBase
 {

    TimeSpan? _endTime=null;
    TimeSpan? _beginTime=null;
    PeriodColor _periodColor=PeriodColor.Gray;

    public PeriodColor PeriodColor
    {
        get { return _periodColor; }
        set { _periodColor = value; }
    }

    public TimeSpan? BeginTime
    {
        get { return _beginTime; }
        set { _beginTime = value }
    }

    public TimeSpan? EndTime
    {
        get { return _endTime; }
        set { _endTime = value; }
    }
}

public enum PeriodColor
{

    Green,
    Red,
    Gray
}

そして私は2つ持っていますList<PeriodBase>:

List<PeriodBase> refPeriods;
List<PeriodBase> donePeriods;

私はこのように表現します(例):

ストック画像です

しかし、私はそれを次のように表現したい:

これは私が欲しいものです

つまり、赤い部分は refListに、緑の部分は doneに、その他の (灰色の) 部分はPS work グラフィック プレゼンターListの両方にある必要があります。Lists比較するためのアルゴリズムを作成するには? 上記のように、線の色をチェックするための列挙型があります。Listsソートされたフォームと分離されたフォームを補充する必要があります。私の説明が非常に悪いことは承知しています。そのため、何も理解できない場合は、もう一度説明するように言ってください。

例(私はのみ表示しますTimeSpans):

ref :  10:00-11:00 ; 13:00-18:00
done : 10:05-11:50 ; 14:00-17:50

ソート後

  ref : 10:00-10:05(red) ; 10:05-11:00(grey) ; 13:00-14:00(red) ; 14:00-17:50(grey) ; 17:50-18:00(red)
done : 10:05-11:00(grey) ; 11:00-11:50(green) ; 14:00-17:50(grey) ;  
4

2 に答える 2

0

私はあなたがいくつかのステップでこれを行うべきだと思います:

  1. LINQを使用List<TimeSpan>するようなものに変換しますList<Tuple<TimeSpan, bool>>
  2. 2つのリストを1つのリストに統合する
  3. リストをBeginTimeで並べ替える
  4. リストを繰り返します
    1. 開始時刻>=開始時刻と開始時刻<終了時刻のレコードがあるかどうかを確認します。「競合」があります。Tuple<TimeSpan, bool>ここでboolがref/doneのフラグである場所に格納されているものに基づいて色を決定します
    2. 等(色付けが必要な時期などを把握するだけです。基本的に条件もあります)
  5. 反復中にすべてのPeriodBaseをリストに追加するだけです
于 2012-09-17T11:18:23.173 に答える
0

あなたのアルゴリズムにはいくつかのステップが必要だと思います:

  1. 参照期間ごとの重複期間のリストを決定します。
  2. 次の方法で、期間ごとの空き領域のリストを決定します
    。期間ごとに 0、1、または 2 つの無料期間 + 重複期間の組み合わせを決定します。
    b. すべての参照期間のすべての空き期間を一緒に交差させます。

次のようになります。

var freePeriodsPerPeriod = 
    from period in refPeriods
    let overlappingPeriods =
        from donePeriod in donePeriods
        let periodsOverlap =
            period.EndTime > donePeriod.StartTime &&
            period.StartTime < donePeriod.EndTime
        where periodsOverlap
        select donePeriod
    select new { period, free = GetFreePeriods(period, overlappingPeriods).ToArray() };

IEnumerable<PeriodBase> GetFreePeriods(PeriodBase period,
    IEnumerable<PeriodBase> overlappingPeriods)
{
    return Intersect(
        from overlappingPeriod in overlappingPeriods
        from freePeriod in GetFreePeriods(period, overlappingPeriod)
        select freePeriod
    );
}

IEnumerable<PeriodBase> GetFreePeriods(PeriodBase period,
    PeriodBase overlappingPeriod)
{
    // return 0, 1, or 2 periods.
    yield return ...
    yield return ...
}

IEnumerable<PeriodBase> Intersect(IEnumerable<PeriodBase> periods)
{
    // TODO
}
于 2012-09-17T11:29:30.313 に答える