我有自定义类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;
我以这种方式表示(例如):
但我想这样代表:
换句话说,红色部分必须在参考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) ;
答案 0 :(得分:0)
我认为你应该通过几个步骤来实现这一目标:
List<TimeSpan>
转换为List<Tuple<TimeSpan, bool>>
之类的内容
答案 1 :(得分:0)
我认为你的algortim应该有几个步骤:
可能看起来像这样:
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
}