LINQ GroupPor tiempo continuo

uponiendo que tengo una estructura simple que se ve así:

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

Y creo una colección así:

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

o que quiero hacer es agrupar los rangos donde son continuos, es decir, son continuos si el valor final del rango anterior es el mismo que el inicio del siguiente.

Podemos suponer que no hay colisiones / duplicados o superposiciones en los valores de Rango.

En el ejemplo publicado, terminaría con dos grupos:

2011-11-1 12:00:00 - 2011-11-1 15:00:00

2011-11-1 16:00:00 - 2011-11-1 17:00:00

Es bastante fácil encontrar una solución iterativa para esto. ¿Pero hay algo de magia LINQ que pueda usar para obtener esto en una bonita línea?

Respuestas a la pregunta(7)

Su respuesta a la pregunta