You can project the group number on each item in the source list using Select and an anonymous type, for example:
var assigned = Class.Students.Select( (item, index) => new { Student = item, GroupNumber = index / 20 + 1 });
Then you can use it as follows:
foreach (var item in assigned) { Console.WriteLine("Student = " + item.Student.Name); Console.WriteLine("You belong to Group " + item.GroupNumber.ToString()); }
Or if you want to select a specific group.
foreach (var student in assigned.Where(x => x.GroupNumber == 5)) { Console.WriteLine("Name = " + student.Name); }
Or, if you want to actually group them to execute aggregates
foreach (var group in assigned.GroupBy(x => x.GroupNumber)) { Console.WriteLine("Average age = " + group.Select(x => x.Student.Age).Average().ToString()); }
Now, if you just want to combine the elements in packages and you do not need to have information about the batch number, you can create this simple extension method.
public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> target, int size) { var assigned = target.Select( (item, index) => new { Value = item, BatchNumber = index / size }); foreach (var group in assigned.GroupBy(x => x.BatchNumber)) { yield return group.Select(x => x.Value); } }
And you can use your new extension method like this.
foreach (var batch in Class.Students.Batch(20)) { foreach (var student in batch) { Console.WriteLine("Student = " + student.Name); } }
Brian Gideon Jul 27 '11 at 20:29 2011-07-27 20:29
source share