DateFrom = new DateTime(2022, 01, 01),
DateTo = new DateTime(2022, 01, 01)
DateFrom = new DateTime(2022, 01, 02),
DateTo = new DateTime(2022, 01, 02)
DateFrom = new DateTime(2022, 01, 04),
DateTo = new DateTime(2022, 01, 04)
DateFrom = new DateTime(2022, 01, 05),
DateTo = new DateTime(2022, 01, 05)
DateFrom = new DateTime(2022, 01, 6),
DateTo = new DateTime(2022, 01, 06)
.GroupBy(x => new { x.RoomTypeId, x.Rate, x.Accessibility })
.SelectMany(groupedAvails => groupedAvails
.OrderBy(avail => avail.DateFrom)
.Segment((curr, prev, _) => prev.DateTo.AddDays(1) != curr.DateFrom)
.Select(consecutiveAvails => new Availability {
Accessibility = consecutiveAvails.First().Accessibility,
RoomTypeId = consecutiveAvails.First().RoomTypeId,
Rate = consecutiveAvails.First().Rate,
DateFrom = consecutiveAvails.First().DateFrom,
DateTo = consecutiveAvails.Last().DateTo
.ForEach(mergedAvail => Console.WriteLine($"{mergedAvail.RoomTypeId} {mergedAvail.Rate} {mergedAvail.Accessibility} {mergedAvail.DateFrom.ToShortDateString()} {mergedAvail.DateTo.ToShortDateString()}"));
public class Availability {
public int Accessibility { get; init; }
public string RoomTypeId { get; init; }
public int Rate { get; init; }
public DateTime DateFrom { get; init; }
public DateTime DateTo { get; init; }