【发布时间】:2016-02-25 16:34:02
【问题描述】:
你能帮我用一个算法来区分两组范围周期吗?
例如:
第一组范围周期: {[01.01.2015 - 10.01.2015] , [15.01.2015 - 30.01.2015]}
第二组区间区间: {[02.01.2015 - 20.01.2015] , [25.01.2015 - 25.01.2015]}
结果应该是: {[01.01.2015 - 01.01.2015],[21.01.2015 - 24.01.2015],[26.01.2015-30.01.2015]}
这是我目前的代码:
private object GetDifferenceRangePeriods(List<RangePeriod> all, List<RangePeriod> toRemove)
{
foreach (var rp in toRemove)
{
var overlappedItems = all.Where(c => DateHelper.IsOverlapping(c.StartDate, c.EndDate, rp.StartDate, rp.EndDate)).ToList();
foreach (var itm in overlappedItems)
{
if (itm.StartDate == rp.StartDate)
{
if (itm.EndDate <= rp.EndDate)
{
all.Remove(itm);
}
else if(itm.EndDate > rp.EndDate)
{
itm.StartDate = rp.EndDate.AddDays(+1);
}
}
if (itm.StartDate < rp.StartDate)
{
if (itm.EndDate <= rp.EndDate)
{
itm.EndDate = rp.StartDate.AddDays(-1);
}
if (itm.EndDate > rp.EndDate)
{
itm.EndDate= rp.StartDate.AddDays(-1);
var newRangePeriod = new RangePeriod
{
StartDate = rp.EndDate.AddDays(+1),
EndDate = itm.EndDate
};
all.Add(newRangePeriod);
}
}
if (itm.StartDate > rp.StartDate)
{
if (itm.EndDate <= rp.EndDate)
{
all.Remove(itm);
}
if (itm.EndDate > rp.EndDate)
{
itm.StartDate = itm.EndDate.AddDays(+1);
}
}
}
}
return all;
}
【问题讨论】:
-
不清楚!你能分享一些代码吗?你尝试了什么?
-
第一组包括范围,第二组排除范围吗?如果是这样,可能想在问题中说明这一点。
-
@ebyrob 我认为这就是 OP 所说的差异,就像第一组减去第二组一样。
-
既然您已经共享了一些代码,您能否更具体地说明给您带来问题的确切部分?也许您可以说出当前代码的结果。
-
为什么你的方法返回
object而不是List<RangePeriod>?此外,您真的应该创建一个新范围的新列表,而不是改变传入的all列表。
标签: c# algorithm date date-range difference