Это можно сделать в цепочке операторов.Я не уверен, если бы я посоветовал такой код, хотя!
public static IEnumerable<IEnumerable<T>> DoIt<T>(this IEnumerable<T> that) {
return that.Zip(that.Skip(1), (a, b) => a.Equals(b) ? 1 : 0)
.Aggregate(
(IEnumerable<int>)new []{1, 0},
(c, x) => (new []{c.First() + 1}).Concat(c.Skip(x)),
_ => _.Zip(_.Skip(1), (to, skip) => new {skip, take = to - skip}))
.Reverse()
.Select(_ => that.Skip(_.skip).Take(_.take));
}