从列表中获取休息时间

Gol*_*den 5 c# algorithm time datetime timespan

我有一份工作项目清单.每个工作项都有开始和结束时间.

所以,基本上它看起来像这样:

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));
Run Code Online (Sandbox Code Playgroud)

现在我想得到工作的总时间.同样,基本上这很容易:

09:00-11:00 => 2 hours
13:00-17:00 => 4 hours
----
06:00 hours
Run Code Online (Sandbox Code Playgroud)

这只是总和.

但现在变得困难:如果我想提取平行时间,我如何计算这个总和呢?

例如,

09:00-11:00 => 2 hours
10:00-11:30 => 1.5 hours
13:00-17:00 => 4 hours
----
06:30 hours
Run Code Online (Sandbox Code Playgroud)

是6.5小时,但总和是7.5小时.两个工作项映射到10点到11点之间的时间这一事实有所不同.

我怎样才能解决这个问题,因为基本上每种可能的方式(周围,开始重叠,结束重叠,包括)可以相互重叠的任意数量的工作项?

Bar*_*ski 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)

  • 示例代码:http://pastebin.com/KnhRwrsX如果需要,可以随意编辑您的答案. (2认同)