如何比较List <periodbase>并获得排序列表?</periodbase>

时间:2012-09-17 11:05:09

标签: c# algorithm

我有自定义类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;

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

it is stock image

但我想这样代表:

this is what i want

换句话说,红色部分必须在参考List中,完成List中的绿色部分和其他(灰色)部分必须同时位于Lists PS工作图形演示者中。如何制作比较算法?如上所示,我有用于检查线条颜色的枚举。我需要以排序的形式重新填充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) ;  

2 个答案:

答案 0 :(得分:0)

我认为你应该通过几个步骤来实现这一目标:

  1. 使用LINQ
  2. List<TimeSpan>转换为List<Tuple<TimeSpan, bool>>之类的内容
  3. 将您的两个列表合并为一个列表
  4. 按BeginTime排序列表
  5. 迭代你的清单
    1. 检查是否有记录开始&gt; =您的开始时间并且开始&lt;你的结束时间:你有一个“冲突”。根据{{​​1}}中存储的内容确定颜色,其中bool是ref / done的标志
    2. 等。 (你只需要弄明白什么时候你需要给事物着色等等。基本上有些条件)
  6. 只需在迭代期间将每个PeriodBase添加到列表中

答案 1 :(得分:0)

我认为你的algortim应该有几个步骤:

  1. 确定每个参考期间的重叠时段列表。
  2. 通过以下方式确定每个时段的可用空间列表:
    一个确定每个周期的0,1或2个空闲周期+重叠周期组合。
    b。将所有参考期间的所有免费期间相交。
  3. 可能看起来像这样:

    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
    }