生成重叠范围的子阵列

时间:2011-03-04 01:44:11

标签: c# overlap range

我的名字是Timothy Sassone。我正在开发一些C#中的某种调度软件,但遇到了一些麻烦。该程序的最后一部分旨在获取每周事件的大量列表(存储为星期几和开始和结束时间),并将它们分类为包含彼此重叠的事件的子列表(这样,没有人可能参加子列表中的两个事件。)

目前,它通过查找列表中的“最长”事件((endTime-startTime)* numDays),并将其与每个重叠的课程添加到子列表中来实现。然后它会找到所有“冲突”(不重叠的事件)并解决它们,同时删除尽可能少的课程。我有这么多,但由于我必须处理的范围数量,我最终得到了相当多的子列表。有没有更好的方法来拆分列表,这样我最终会有更少的子列表?

我考虑过一种蛮力方法,只是尝试各种可能性并且最好地进行,但是范围的数量足够高(平均值在100-500之间),这样做可能会相当慢。任何建议或指示都将非常受欢迎。

感谢您的时间,

蒂莫西·萨索(Timothy Sassone)

1 个答案:

答案 0 :(得分:0)

用于.NET的时间段库 http://www.codeproject.com/KB/datetime/TimePeriod.aspx包含 TimePeriodIntersector 以搜索重叠时段。

通过对时间线上的所有时刻进行计数/排序,使用线性和快速算法计算重叠。

TimePeriodIntersector 的用法如下:

// ----------------------------------------------------------------------
public void TimePeriodCombinerSample()
{
  TimePeriodCollection periods = new TimePeriodCollection();

  periods.Add( new TimeRange( new DateTime( 2011, 3, 01 ), new DateTime( 2011, 3, 10 ) ) );
  periods.Add( new TimeRange( new DateTime( 2011, 3, 04 ), new DateTime( 2011, 3, 08 ) ) );

  periods.Add( new TimeRange( new DateTime( 2011, 3, 15 ), new DateTime( 2011, 3, 18 ) ) );
  periods.Add( new TimeRange( new DateTime( 2011, 3, 18 ), new DateTime( 2011, 3, 22 ) ) );
  periods.Add( new TimeRange( new DateTime( 2011, 3, 20 ), new DateTime( 2011, 3, 24 ) ) );

  periods.Add( new TimeRange( new DateTime( 2011, 3, 26 ), new DateTime( 2011, 3, 30 ) ) );

  TimePeriodCombiner<TimeRange> periodCombiner = new TimePeriodCombiner<TimeRange>();
  ITimePeriodCollection combinedPeriods = periodCombiner.CombinePeriods( periods );

  foreach ( ITimePeriod combinedPeriod in combinedPeriods )
  {
    Console.WriteLine( "Combined Period: " + combinedPeriod );
  }
  // > Combined Period: 01.03.2011 - 10.03.2011 | 9.00:00
  // > Combined Period: 15.03.2011 - 24.03.2011 | 9.00:00
  // > Combined Period: 26.03.2011 - 30.03.2011 | 4.00:00
} // TimePeriodCombinerSample