0

我期待另一个系统以 30 分钟为间隔提供以下时间数据序列。我需要将这 30 分钟的配对设置为一小时的间隔:

例如源数据:

Start:7:00
End: 7:30
Start:7:30
End: 8:00
Start:8:00
End: 8:30
Start:8:30
End: 9:00

转换为小时数据,如下所示:

Start:7:00
End: 8:00
Start:8:00
End: 9:00

如果 30 分钟块没有匹配,则应忽略此记录:例如

 Start:7:00
    End: 7:30
    Start:7:30
    End: 8:00
    Start:8:00
    End: 8:30
    Start:8:30
    End: 9:00
    Start:9:00 <-- Ignore this 
    End: 9:30  <-- Ignore this

有人可以建议如何实现吗?

4

1 回答 1

0

我的解决方案的总体思路是您只需在索引处获取元素:

0, 3, 4, 7, 8, 11, 12, ...

或者换句话说 - 如果index % 4是 0 或 3。

在此之前,我们检查是否在末尾有剩余日期count % 4。如果有的话——我们剪掉它们。

这假设日期将作为您说明的输入全部有效。

这是我的实现:

public static IEnumerable<DateTime> CutTimes(IEnumerable<DateTime> source)
{
    var count = source.Count();
    var ignore = count % 4;

    if (ignore != 0)
    {
        source = source.Take(count - ignore);
    }

    return source.Where((time, index) => index % 4 == 0 || index % 4 == 3);
}

用法:

var times = new[]
                {
                    new DateTime(2012, 5, 10, 7, 00, 0),
                    new DateTime(2012, 5, 10, 7, 30, 0),
                    new DateTime(2012, 5, 10, 7, 30, 0),
                    new DateTime(2012, 5, 10, 8, 00, 0),
                    new DateTime(2012, 5, 10, 8, 00, 0),
                    new DateTime(2012, 5, 10, 8, 30, 0),
                    new DateTime(2012, 5, 10, 8, 30, 0),
                    new DateTime(2012, 5, 10, 9, 00, 0),
                    new DateTime(2012, 5, 10, 9, 00, 0),
                    new DateTime(2012, 5, 10, 9, 30, 0)
                };

var result = CutTimes(times);

foreach (var time in result)
{
    Console.WriteLine(time);
}

输出:

2012 年 10 月 5 日 07:00:00

2012 年 10 月 5 日 08:00:00

2012 年 10 月 5 日 08:00:00

2012 年 10 月 5 日 09:00:00

于 2012-05-10T02:55:05.143 回答