如何对时间列表("time clock")的相邻值的差异求和?

How to sum differences in adjacent values of list of times ("time clock")?

我正在查询我的数据库以获取 "events" 的列表,例如员工的打卡、开始休息、结束休息、打卡下班。现在我需要总结每个相邻对之间的差异,例如:totalTime=(t4-t3)+(t2-t1) 我似乎无法理解它:(

到目前为止我尝试过的是:

TimeSpan totalTime = new TimeSpan();

for (int i = 0; i < worked.Count - 1; i++)
{
    totalTime = totalTime.Add(worked[i + 1].Time - worked[i].Time);
}

这给了我(毫不奇怪)每对连续的差异的总和,所以:totalTime = (t4 - t3) + (t3 - t2) + (t2 - t1)

对不起,我想我是太累了,但脑子一片空白。

是的,你太累了,睡会吧! :D

假设您可以可靠地说您的数组包含连续的 clock-in/clock-out 对(或类似的,例如配对 "enter/exit"、"start/stop" 次等),您还可以假设该数组有偶数个条目(或者,在最坏的情况下,如果末尾有一个您不关心的奇数条目)。

在这种情况下,您只需跳过 2:

TimeSpan totalTime = new TimeSpan();

for (int i = 0; i < worked.Count - 1; i += 2) // Notice we're incrementing by 2 now
{
    totalTime = totalTime.Add(worked[i + 1].Time - worked[i].Time);
}

如果你有不匹配的对,这显然会失败:假设有人忘记下班或下班两次,或者你正在使用的查询恰好 select "clock out" 作为第一个时间,然后是下一个 "clock in" - 在这种情况下,您将测量 打卡时间之间的时间。只是要非常小心你正在获取的数据。

如果有一种方法可以将签入和签出提取到单独的数组中,那将是一个更强大的解决方案,但时间聚合变得更加困难,因为你必须设计关于什么的特定规则如果特定事件缺失或有多个,就会发生这种情况。但这是对另一个问题的讨论,是否应该涉及到这个问题。