using System.Collections.Generic;
public static class Program
public static void Main()
var days = new List<OfficeHour> {
new OfficeHour { DayOfWeek = 0, OpenTime = "6am", ClosedTime = "5pm" },
new OfficeHour { DayOfWeek = 1, OpenTime = "6am", ClosedTime = "5pm" },
new OfficeHour { DayOfWeek = 2, OpenTime = "6am", ClosedTime = "5pm" },
new OfficeHour { DayOfWeek = 3, OpenTime = "6am", ClosedTime = "2pm" },
new OfficeHour { DayOfWeek = 4, OpenTime = "6am", ClosedTime = "2pm" },
new OfficeHour { DayOfWeek = 5, IsClosed = true },
new OfficeHour { DayOfWeek = 6, OpenTime = "6am", ClosedTime = "2pm" }
.OrderBy(d => d.DayOfWeek)
.GroupAdjacentBy((prev, cur) =>
prev.OpenTime == cur.OpenTime
&& prev.ClosedTime == cur.ClosedTime
&& prev.IsByAppointment == cur.IsByAppointment
&& prev.IsClosed == cur.IsClosed
foreach (var dayGroup in groups)
var day = dayGroup.First();
Console.WriteLine("{0} - {1}, {2} - {3}", day.DayOfWeek, dayGroup.Last().DayOfWeek, day.OpenTime, day.ClosedTime);
public int DayOfWeek { get; set; }
public string OpenTime { get; set; }
public string ClosedTime { get; set; }
public bool IsByAppointment { get; set; }
public bool IsClosed { get; set; }
public static IEnumerable<IEnumerable<T>> GroupAdjacentBy<T>(
this IEnumerable<T> source, Func<T, T, bool> predicate)
using (var e = source.GetEnumerator())
var list = new List<T> { e.Current };
if (predicate(pred, e.Current))
list = new List<T> { e.Current };