2012-04-23 125 views
0

我有一个列表:计算时间跨度

List<DateTime> timeStamp; 

比方说,该列表包含以下DateTime是否:

2006-09-07 11:46:09 
2006-09-07 11:46:19 
2006-09-07 11:46:20 
2006-09-07 11:46:36 

2006-09-07 11:47:49 
2006-09-07 11:47:53 
2006-09-07 11:48:02 
2006-09-07 11:48:15 
2006-09-07 11:48:29 
2006-09-07 11:48:34 

2006-09-07 11:54:29 
2006-09-07 11:54:39 
2006-09-07 11:54:49 
2006-09-07 11:54:59 

2006-09-07 11:56:19 
2006-09-07 11:56:29 
2006-09-07 11:56:39 

2006-09-07 11:58:29 
2006-09-07 11:58:34 
2006-09-07 11:58:45 
2006-09-07 11:58:53 

2006-09-07 12:00:29 
2006-09-07 12:00:39 
2006-09-07 12:00:45 
2006-09-07 12:00:54 
2006-09-07 12:01:03 

现在,我要计算总累计时间。所有这些时间都在同一个列表中,差距表示停止/开始部分。我也无法控制时间戳的时间间隔。可能是10秒,可能是1分钟。感谢您的帮助!

+1

您列出的时间的期望值是多少?是14:54吗? – 2012-04-23 21:06:58

+1

列表中的“空白”如何表示?如果列表中唯一的内容是时间戳本身,那么列表中的消费者如何知道它不能累积的时间间隔? – 2012-04-23 21:09:10

+0

你已经把你的样本列表分成了几个部分,我假设这些部分不在实际的'List '中。这些组并不都是偶数的DateTime,所以我认为我们不能把所有的东西都当作开始/停止对。你能通过你的名单,并说出预期的总数是多少,以及这是怎么产生的? – 2012-04-23 22:11:46

回答

2

这里有一个新的答案,如果你可以定义的缝隙的长度:

var length = timestamps 
      .Zip(timestamps.Skip(1), (a, b) => b - a)  // pairwise entries and timespan 
      .Where(gap => gap < TimeSpan.FromSeconds(180)) // ignore large gaps 
      .Sum(x => x.TotalMilliseconds);    // total span in ms 

这是通过荏苒列表对自身,使得被相邻的其他项可供选择(即列表被选择'成对')。时间跨度是从这些计算出来的,并且大时间跨度(即您想要忽略的时间间隔)被过滤掉。

+0

它将被排序,但实际上并没有解决问题。如果你注意到这些差距,你会发现在没有任何事情发生的时候,有30秒到6分钟的时间。如果我做了你的解决方案,那么这段时间将包括在内,我的计算将是错误的。 – MyCodeSucks 2012-04-23 21:05:38

+3

对不起,开始/停止部分的定义是什么?除了'缺口'之外,我无法看到它 - 列表中是如何表示的? – yamen 2012-04-23 21:07:40

+0

问题是它没有真正代表列表中。所有时间戳都在一起。我发现在这个问题出现之前,我确实会知道这个间隔。我正在考虑迭代整个列表,并在邮票中查找大于间隔的间隙,计算时间间隔,并继续迭代到下一个间隔,并继续添加到累计时间间隔。例如: ' if element [6]>从元素[7]开始间隔然后从 计算从元素[1]到元素[6]的时间' – MyCodeSucks 2012-04-23 21:13:01