Предполагая, что у меня есть простая структура, которая выглядит так:
public class Range
{
public DateTime Start { get; set; }
public DateTime End { get; set; }
public Range(DateTime start, DateTime end)
{
this.Start = start;
this.End = end;
}
}
И я создаю такую коллекцию:
var dr1 = new Range(new DateTime(2011, 11, 1, 12, 0, 0),
new DateTime(2011, 11, 1, 13, 0, 0));
var dr2 = new Range(new DateTime(2011, 11, 1, 13, 0, 0),
new DateTime(2011, 11, 1, 14, 0, 0));
var dr3 = new Range(new DateTime(2011, 11, 1, 14, 0, 0),
new DateTime(2011, 11, 1, 15, 0, 0));
var dr4 = new Range(new DateTime(2011, 11, 1, 16, 0, 0),
new DateTime(2011, 11, 1, 17, 0, 0));
var ranges = new List<Range>() { dr1, dr2, dr3, dr4 };
Что я хочу сделать, это группировать диапазоны, где они непрерывны, т.е. они непрерывны, если значение End предыдущего диапазона совпадает с началом следующего.
Мы можем предположить, что в значениях Диапазона нет коллизий/дубликатов или перекрытий.
В опубликованном примере я получаю две группы:
2011-11-1 12:00:00 - 2011-11-1 15:00:00
2011-11-1 16:00:00 - 2011-11-1 17:00:00
Для этого достаточно просто найти итеративное решение. Но есть ли какая-то магия LINQ, которую я могу использовать, чтобы получить это в довольно однострочном лайнере?