我有一份工作项目清单。每个工作项都有开始和结束时间。
所以,基本上它看起来像这样:
List<Work> works = new List<Work>();
works.Add(new Work(
new DateTime(2013, 4, 30, 9, 0, 0),
new DateTime(2013, 4, 30, 11, 0, 0));
现在我想获得有效的总时间。同样,基本上这很容易:
09:00-11:00 => 2 hours
13:00-17:00 => 4 hours
----
06:00 hours
这只是总和。
但现在变得困难:如果我想提取平行时间,我如何计算这个总和?
如,
09:00-11:00 => 2 hours
10:00-11:30 => 1.5 hours
13:00-17:00 => 4 hours
----
06:30 hours
是6.5小时,但总和是7.5小时。两个工作项映射到10点到11点之间的时间这一事实有所不同。
我怎样才能解决这个问题,因为基本上每种可能的方式(周围,开始重叠,结束重叠,包括)都可以相互重叠的任意数量的工作项?
答案 0 :(得分:6)
创建(时间,值)对,其中值为+1,用于开始工作,-1为结束。然后按日期对对进行排序。迭代你得到的列表,你可以计算出值的总和 - 当它是正数时,工作就是“继续”。在迭代时,标记值的总和从0到正,从正到0的时刻。你将得到不相交的间隔。
示例:
11 - 13, 12 - 16, 15-17 18 - 19
给你(11,1)(12,1)(13 -1)(15,1)(16,-1)(17,-1)(18,1)(19,-1)
总和去(11,1)(12,2)(13 1)(15,2)(16,1)(17,1)(18,1)(19,0),
所以不相交的时期是(11,17)和(18,19)
答案 1 :(得分:2)
它应该可以正常工作,但是如果你有大量的数据,可能有更好的方法来解决它。这只是最简单的方法(至少对我而言)。您最终会得到没有重叠部分的时间列表,因此您可以遍历列表并总结时间。