tags:

views:

36

answers:

3

Hi All,

how can I split a sequence of numbers into subgroups of numbers and get the local minimum and maximum of the subgroups with linq?

If I have a sequence of, lets say 11 items { 3, 2, 5, 9, 9, 6, 7, 2, 5, 11, 2 }
I want to split this into subgroups with 3 or less items.

So I get the following 4 subgroups: { 3, 2, 5 } , { 9, 9, 6 } , { 6, 7, 2} , { 11, 2}

The final return values of the LinQ expression (getting min and max for each group) should be 2, 5, 6, 9, 2, 7, 2, 11

TIA, Sascha

+2  A: 

This should do it.

var numbers = new[] { 3, 2, 5, 9, 9, 6, 7, 2, 5, 11, 2 };
var query = from p in numbers.Select((n, i) => new { n, Group = i / 3 })
            group p.n by p.Group into g
            from n in new[] { g.Min(), g.Max() }
            select n;
Jeff M
+2  A: 

Well, using MoreLINQ's Batch method to do the grouping, you could use:

var query = source.Batch(3, batch => new[] { batch.Min(), batch.Max() })
                  .SelectMany(x => x);
Jon Skeet
One point is that the last item will be doubled if it is alone in its group. `{1}`->`{1,1}`. Of course, it fits the requirements.
Kobi
A: 

Thanks Kobi, you're right, little lack of concentration in the morning :-)

The correct subgroups are: { 3, 2, 5 } , { 9, 9, 6 } , { 7, 2, 5} , { 11, 2}

Sascha
Hello, welcome to stack overflow. Please edit your question and fix it - you accidentally added an *answer*.
Kobi