LINQ GroupBy непрерывное время

Предполагая, что у меня есть простая структура, которая выглядит примерно так:

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 };

Я хочу сгруппировать диапазоны, в которых они являются непрерывными - т.е. они являются непрерывными, если конечное значение предыдущего диапазона совпадает с началом следующего.

Мы можем предположить, что в значениях диапазона нет коллизий / дубликатов или перекрытий.

В опубликованном примере я бы получил две группы:

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, которую я могу использовать, чтобы получить это в довольно однострочном виде?

10
задан casperOne 11 November 2011 в 22:07
поделиться