C# にはありませんが、SQL でこの正確な問題を解決する必要がありました。おそらく、これを C# に変換する方法についてのヒントが得られるでしょう。
select Resource_ID, Appointment_date, Min(NewStartTime) Start_Time, MAX(End_Time) End_Time
into #CleanedBlockTimes
from
(
select *,
NewStartTime = Dateadd(mi, v.number, t.Start_Time),
NewStartTimeGroup =
dateadd(mi,
1- DENSE_RANK() over (partition by Resource_ID, Appointment_date order by Dateadd(mi, v.number, t.Start_Time)),
Dateadd(mi, v.number, t.Start_Time))
from #BlockTimes t
inner join master..spt_values v
on v.type='P' and v.number <= DATEDIFF(mi, Start_Time, End_Time)
) X
group by Resource_ID, Appointment_date, NewStartTimeGroup
order by Resource_ID, Appointment_date, Start_Time