No there are no such collections in the standard library. However, you can implement a custom simple method for it; providing that the period is Tuple<DateTime, DateTime>
:
private static IEnumerable<Tuple<DateTime, DateTime>> Accumulate(
IEnumerable<Tuple<DateTime, DateTime>> source) {
var data = source
.OrderBy(date => date.Item1)
.ThenByDescending(date => date.Item2);
DateTime left = DateTime.MinValue; // make compiler be happy: initialization
DateTime right = DateTime.MinValue; // -/-
bool first = true;
foreach (var item in data) {
if (first) {
left = item.Item1;
right = item.Item2;
first = false;
}
else if (right.AddDays(1) >= item.Item1) // can be combined; keep on combining
right = item.Item2 > right ? item.Item2 : right;
else {
// can't be combined: return previous chunk
yield return Tuple.Create(left, right);
// start a new chunk
left = item.Item1;
right = item.Item2;
}
}
// if we have a very last chunk to return, do it
if (!first)
yield return Tuple.Create(left, right);
}
Then
Tuple<DateTime, DateTime>[] test = new Tuple<DateTime, DateTime>[] {
Tuple.Create(new DateTime(2018, 01, 01), new DateTime(2018, 01, 02)),
Tuple.Create(new DateTime(2018, 02, 15), new DateTime(2018, 03, 21)),
Tuple.Create(new DateTime(2018, 01, 10), new DateTime(2018, 01, 10)),
Tuple.Create(new DateTime(2018, 01, 03), new DateTime(2018, 01, 09)),
};
var result = Accumulate(test)
.ToList();
string report = string.Join("," + Environment.NewLine, result
.Select(item => $"({item.Item1:yyyy'/'MM'/'dd}, {item.Item2:yyyy'/'MM'/'dd})"));
Console.Write(report);
Outcome
(2018/01/01, 2018/01/10),
(2018/02/15, 2018/03/21)