给定一个日期范围列表,我想得到一个连续日期范围列表.
我不太确定我正在寻找的术语,但我已经把一个骨架放在一起:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; namespace ContiguousTimeSpans { class Program { static void Main(string[] args) { Listranges = 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; } } }
有没有办法推断出连续的范围?
我不确定我是否完全理解这一点,但关于写的内容和测试数据应该有效:
public static ListGetContiguousTimespans(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; }
当然这也需要为边界值添加一些检查,但我猜想一般的想法应该是明确的.