Единственными интересными значениями являются первый компонент и последний компонент, все остальные будут 60
независимо от того, что (если есть разрыв не менее одного часа). Вот почему я хотел бы использовать следующий код:
public static IEnumerable<int> GetBreakdown(DateTime onTime, DateTime offTime) {
if (offTime < onTime) {
throw new ArgumentException();
}
// Case where the two times start at the same hour
if (onTime.Hour == offTime.Hour) {
yield return offTime.Minute - onTime.Minute;
yield break;
}
// Nominal case
yield return 60 - onTime.Minute;
for (int i = onTime.Hour + 1; i < offTime.Hour; i++) {
yield return 60;
}
if (offTime.Minute != 0) {
yield return offTime.Minute;
}
}
, который вы можете использовать следующим образом:
DateTime onTime = new DateTime(2019, 11, 6, 6, 30, 0);
DateTime offTime = new DateTime(2019, 11, 6, 10, 45, 0);
foreach (var value in GetBreakdown(onTime, offTime)) {
Console.WriteLine(value);
}
// Prints:
// 30
// 60
// 60
// 60
// 45
Обратите внимание, что предполагается, что оба находятся в один и тот же день,не учитывать Date
компонент входов. Отсюда вы можете легко изменить тип возврата с IEnumerable<int>
на IEnumerable<(int, int)>
и внести изменения, чтобы возвращать компонент часа в каждом yield
.