Consider the following collection.
I
This does what you're looking for and is generic:
private static IEnumerable> GroupConsecutive(this IEnumerable set, Func predicate)
{
var i = 0;
var k = 0;
var ranges = from e in set
let idx = ++i
let next = set.ElementAtOrDefault(idx)
let key = (predicate(e, next)) ? k : k++
group e by key into g
select g;
return ranges;
}
Usage:
var set = new List
{
true,
false,
false,
false,
true,
true,
false,
false,
};
var groups = set.GroupConsecutive((b1, b2) => (b1 == b2));
foreach (var g in groups)
{
Console.WriteLine(g.Key);
foreach (var b in g)
Console.WriteLine("\t{0}", b);
}
Output:
0
True
1
False
False
False
2
True
True
3
False
False