List<TimeRange> FindAvailableGaps(List<TimeRange> existingBookings, DateTime desiredDate, TimeSpan desiredDuration)
{
// Define the full day range
var fullDayRange = new TimeRange(desiredDate, desiredDate.AddDays(1));
// Get the gaps between existing bookings
var bookedPeriods = existingBookings.OrderBy(b => b.Start).ToList();
var availableGaps = new List<TimeRange>();
if (bookedPeriods.Count > 0 && bookedPeriods[0].Start > fullDayRange.Start)
{
availableGaps.Add(new TimeRange(fullDayRange.Start, bookedPeriods[0].Start));
}
for (int i = 0; i < bookedPeriods.Count - 1; i++)
{
var gap = new TimeRange(bookedPeriods[i].End, bookedPeriods[i + 1].Start);
if (gap.Duration >= desiredDuration)
{
availableGaps.Add(gap);
}
}
if (bookedPeriods.Count > 0 && bookedPeriods.Last().End < fullDayRange.End)
{
availableGaps.Add(new TimeRange(bookedPeriods.Last().End, fullDayRange.End));
}
return availableGaps;
}
List<TimeRange> FindAvailableGaps(List<TimeRange> existingBookings, DateTime desiredDate, TimeSpan desiredDuration)
{
// Define the full day range
var fullDayRange = new TimeRange(desiredDate, desiredDate.AddDays(1));
// Get the gaps between existing bookings
var bookedPeriods = existingBookings.OrderBy(b => b.Start).ToList();
var availableGaps = new List<TimeRange>();
if (bookedPeriods.Count > 0 && bookedPeriods[0].Start > fullDayRange.Start)
{
availableGaps.Add(new TimeRange(fullDayRange.Start, bookedPeriods[0].Start));
}
for (int i = 0; i < bookedPeriods.Count - 1; i++)
{
var gap = new TimeRange(bookedPeriods[i].End, bookedPeriods[i + 1].Start);
if (gap.Duration >= desiredDuration)
{
availableGaps.Add(gap);
}
}
if (bookedPeriods.Count > 0 && bookedPeriods.Last().End < fullDayRange.End)
{
availableGaps.Add(new TimeRange(bookedPeriods.Last().End, fullDayRange.End));
}
return availableGaps;
}