Как суммировать различия в соседних значениях списка времен («таймер»)? - PullRequest
1 голос
/ 16 апреля 2019

Я запрашиваю свою базу данных, чтобы получить список «событий», таких как punch in, start break, end break, punch out для сотрудника. Теперь мне нужно сложить разницу между каждой соседней парой, например: 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).

Извините, я думаю, я переутомился, но рисую пробел.

1 Ответ

1 голос
/ 16 апреля 2019

Да, ты переутомился, поспи! : D

Предполагая, что вы можете с уверенностью сказать, что ваш массив содержит последовательные пары входов / выходов (или аналогичные, например, парные входы / выходы, время запуска / остановки и т. Д.), Вы также можете предположить, что массив содержит четное количество записей (или, в худшем случае, если в конце есть нечетная запись, которая вас не волнует).

В этом случае вам просто нужно пропустить на 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);
}

Очевидно, что это ужасно падает, если у вас есть несовпадающие пары: скажем, кто-то забывает отключить или выключить дважды, или в результате запроса, который вы используете, выбирается «время выключения» в первый раз, а затем следующий » часы в "- в этом случае вы будете измерять время между синхронизированными временами. Просто будьте очень осторожны с данными, которые вы извлекаете.

Если есть способ извлечения в отдельные массивы для входов и выходов, это сделало бы гораздо более надежное решение, но агрегация времени становится намного сложнее, потому что вы должны разработать конкретные правила о том, что произойдет, если отдельные события отсутствуют или кратны. Но это обсуждение другого вопроса, если до этого дойдет.

...