检查30分钟间隔对并忽略是否找不到对

时间:2012-05-10 02:31:24

标签: c# linq c#-4.0

我期待从另一个系统以30分钟为间隔的以下时间序列数据。我需要将这个30分钟的对子间隔到一小时:

e.g。 来源数据:

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分钟无法匹配,则应忽略此记录: e.g

 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

有人可以建议如何实现这一目标吗?

1 个答案:

答案 0 :(得分: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);
}

输出:

  

10/05/2012 07:00:00

     

10/05/2012 08:00:00

     

10/05/2012 08:00:00

     

10/05/2012 09:00:00