当前位置:  开发笔记 > 编程语言 > 正文

获取连续的日期范围

如何解决《获取连续的日期范围》经验,为你挑选了1个好方法。

给定一个日期范围列表,我想得到一个连续日期范围列表.

在此输入图像描述

我不太确定我正在寻找的术语,但我已经把一个骨架放在一起:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace ContiguousTimeSpans
{
    class Program
    {
        static void Main(string[] args)
        {
            List ranges = new List();
            ranges.Add(new DateRange(DateTime.Parse("01/12/2015 07:00:00"), DateTime.Parse("01/12/2015 10:00:00")));
            ranges.Add(new DateRange(DateTime.Parse("01/12/2015 06:00:00"), DateTime.Parse("01/12/2015 09:00:00")));
            ranges.Add(new DateRange(DateTime.Parse("01/12/2015 05:00:00"), DateTime.Parse("01/12/2015 08:00:00")));
            ranges.Add(new DateRange(DateTime.Parse("01/12/2015 18:00:00"), DateTime.Parse("01/12/2015 21:00:00")));
            ranges.Add(new DateRange(DateTime.Parse("01/12/2015 12:00:00"), DateTime.Parse("01/12/2015 14:00:00")));
            ranges.Add(new DateRange(DateTime.Parse("01/12/2015 20:00:00"), DateTime.Parse("01/12/2015 22:00:00")));
            ranges.Add(new DateRange(DateTime.Parse("01/12/2015 11:00:00"), DateTime.Parse("01/12/2015 23:00:00")));

            List contiguousBlocks = GetContiguousTimespans(ranges);
            Debug.Assert(contiguousBlocks.Count == 2);

            Debug.Assert(contiguousBlocks[0].Start.Hour == 5);
            Debug.Assert(contiguousBlocks[0].End.Hour == 10);

            Debug.Assert(contiguousBlocks[1].Start.Hour == 11);
            Debug.Assert(contiguousBlocks[1].End.Hour == 23);

            Console.ReadKey();
        }

        public static List GetContiguousTimespans(List ranges)
        {
            List result = new List();
            //???
            return result;
        }
    }

    public class DateRange
    {
        public DateTime Start { get; set; }
        public DateTime End { get; set; }

        public DateRange(DateTime start, DateTime end)
        {
            Start = start;
            End = end;
        }
    }
}

有没有办法推断出连续的范围?



1> 小智..:

我不确定我是否完全理解这一点,但关于写的内容和测试数据应该有效:

public static List GetContiguousTimespans(List ranges)
{
    List result = new List();
    ranges.Sort((a,b)=>a.Start.CompareTo(b.Start));
    DateRange cur = ranges[0];

    for (int i = 1; i < ranges.Count; i++)
    {
        if (ranges[i].Start <= cur.End)
        {
            if (ranges[i].End >= cur.End)
                cur.End = ranges[i].End;
        }
        else
        {
            result.Add(cur);
            cur = ranges[i];
        }
    }

    result.Add(cur);

    return result;
}

当然这也需要为边界值添加一些检查,但我猜想一般的想法应该是明确的.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有