5

I am wanting to loop through this list of name value pairs and grab them in groups of 4.

The data would be like:

value1 1
value2 1
value3 1
value4 1
value1 2
value2 2
value3 2
value4 2

and it would group it as 1 list that contains

value1 1
value2 1
value3 1
value4 1

and another list that contains

value1 2
value2 2
value3 2
value4 2

I know this can be done easily with a for loop, but I am wondering if there is a good way to do it with LINQ.

Paul Parker
  • 467
  • 1
  • 8
  • 21
  • possible duplicate of [Split List into Sublists with LINQ](http://stackoverflow.com/questions/419019/split-list-into-sublists-with-linq) – nawfal Feb 18 '13 at 10:30

3 Answers3

7

This will group by every 4 items (a, b, c, d), (e, f, g, h), (i, j)

var abc = new string[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" };

var xyz = abc.Select((e, i) => new { Item = e, Grouping = (i / 4) }).GroupBy(e => e.Grouping);
GWB
  • 2,575
  • 2
  • 23
  • 28
5

There's nothing built into the framework to do this easily, but MoreLINQ has the Batch method:

IEnumerable<IEnumerable<DataItem>> groups = source.Batch(4);

foreach (IEnumerable<DataItem> group in groups)
{
    foreach (DataItem item in group)
    {
        ...
    }
}
Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
0

I think you're looking for GroupBy.

Shane Fulmer
  • 7,510
  • 6
  • 35
  • 43