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
}

我有两个List<PeriodBase>

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

我以这种方式表示(例如):

它是库存图片

但我想这样表示:

这就是我要的

换句话说,红色部分必须在 refList中,绿色部分在 doneList中,其他(灰色)部分必须在ListsPS 工作图形演示器中。如何制作比较算法?正如您在上面看到的,我有用于检查线条颜色的枚举。我需要重新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. 将您的两个列表合并为一个列表
  3. 按 BeginTime 对列表进行排序
  4. 迭代你的列表
    1. 检查是否有记录开始 >= 你的开始时间和开始 < 你的结束时间:你有一个“冲突”。根据存储在Tuple<TimeSpan, bool>where bool is a flag for ref/done中的内容确定颜色
    2. 等等(你只需要弄清楚什么时候需要给东西上色等。基本上是一些条件)
  5. 只需在迭代期间将每个 PeriodBase 添加到列表中
于 2012-09-17T11:18:23.173 回答
0

我认为您的算法应该有几个步骤:

  1. 确定每个参考周期的重叠周期列表。
  2. 通过以下方式确定每个周期的可用空间列表
    :确定每个时段 + 重叠时段组合的 0、1 或 2 个空闲时段。
    湾。将所有参考周期的所有空闲周期相交。

它可能看起来像这样:

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 回答