Нет, в стандартной библиотеке нет таких коллекций.Тем не менее, вы можете реализовать собственный простой метод для него;при условии, что период равен 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);
}
Тогда
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);
Результат
(2018/01/01, 2018/01/10),
(2018/02/15, 2018/03/21)