cul*_*rer 1 c# linq datetime loops
我试图详细了解一段时间内每小时的分钟数。例如,假设我有两个日期时间,如下所示:
DateTime onTime = new DateTime(2019, 11, 6, 6, 30, 0);
DateTime offTime = new DateTime(2019, 11, 6, 10, 45, 0);
Run Code Online (Sandbox Code Playgroud)
所以有两个 DateTime 代表:
"2019-11-06 06:30:00"
"2019-11-06 10:45:00"
Run Code Online (Sandbox Code Playgroud)
我想要实现的是给定时间段内每小时的分钟数细分。我希望它看起来像:
int 6 = 30; // Hour 6 = 30 minutes
int 7 = 60; // Hour 7 = 60 minutes
int 8 = 60; // Hour 8 = 60 minutes
int 9 = 60; // Hour 8 = 60 minutes
int 10 = 45; // Hour 10 = 45 minutes
Run Code Online (Sandbox Code Playgroud)
我可以确定是尝试使用 LINQ 还是仅使用自引用迭代函数来达到所需的效果。
唯一有趣的值是第一个组件和最后一个组件,所有其他值都将是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;
}
}
Run Code Online (Sandbox Code Playgroud)
你可以这样使用:
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
Run Code Online (Sandbox Code Playgroud)
请注意,它假设两者在同一天,它不考虑Date输入的组成部分。从这里您可以轻松地将返回类型从IEnumerable<int>toIEnumerable<(int, int)>更改为返回每个 中的小时部分yield。