0

I have a collection of event dates which consist of the following:

class EventDate
{
    DateTime startDate;  // the date when the event starts
    int lengthInHours;   // how many hours the event will run for
}

When a new one is to be added, I need to check to make sure the event will not overlap any of the existing events in the collection.

What would be an elegant way to do this check?

Marcelo Mason
  • 6,750
  • 2
  • 34
  • 43

2 Answers2

2

Try this method:

class EventDate
{
    DateTime startDate;  // the date when the event starts
    int lengthInHours;   // how many hours the event will run for

    public bool Overlaps(EventDate otherDate)
    {
        double hours = (otherDate.startDate - startDate).TotalHours;
        return (hours >= 0 && hours <= lengthInHours) ||
               (hours < 0 && -hours <= otherDate.lengthInHours);
    }
}

Usage for collection:

bool isOverlapped = collection.Any(date => date.Overlaps(newDate));
Dmitry
  • 13,797
  • 6
  • 32
  • 48
1

You can use the TimePeriodChain class of the Time Period Library for .NET. The collection ensures chaining time periods:

// ----------------------------------------------------------------------
public void TimePeriodChainSample()
{
  TimePeriodChain timePeriods = new TimePeriodChain();

  DateTime now = ClockProxy.Clock.Now;
  DateTime testDay = new DateTime( 2010, 7, 23 );

  // --- add ---
  timePeriods.Add( new TimeBlock(
                   TimeTrim.Hour( testDay, 8 ), Duration.Hours( 2 ) ) );
  timePeriods.Add( new TimeBlock( now, Duration.Hours( 1, 30 ) ) );
  timePeriods.Add( new TimeBlock( now, Duration.Hour ) );
  Console.WriteLine( "TimePeriodChain.Add(): " + timePeriods );
  // > TimePeriodChain.Add(): Count = 3; 23.07.2010 08:00:00 - 12:30:00 | 0.04:30
  foreach ( ITimePeriod timePeriod in timePeriods )
  {
    Console.WriteLine( "Item: " + timePeriod );
  }
  // > Item: 23.07.2010 08:00:00 - 10:00:00 | 02:00:00
  // > Item: 23.07.2010 10:00:00 - 11:30:00 | 01:30:00
  // > Item: 23.07.2010 11:30:00 - 12:30:00 | 01:00:00

  // --- insert ---
  timePeriods.Insert( 2, new TimeBlock( now, Duration.Minutes( 45 ) ) );
  Console.WriteLine( "TimePeriodChain.Insert(): " + timePeriods );
  // > TimePeriodChain.Insert(): Count = 4; 23.07.2010 08:00:00 - 13:15:00 | 0.05:15
  foreach ( ITimePeriod timePeriod in timePeriods )
  {
    Console.WriteLine( "Item: " + timePeriod );
  }
  // > Item: 23.07.2010 08:00:00 - 10:00:00 | 02:00:00
  // > Item: 23.07.2010 10:00:00 - 11:30:00 | 01:30:00
  // > Item: 23.07.2010 11:30:00 - 12:15:00 | 00:45:00
  // > Item: 23.07.2010 12:15:00 - 13:15:00 | 01:00:00
} // TimePeriodChainSample