How do I segment the elements iterated over in a foreach loop
Solution 1:
You can do something like this:
int i = 0;
foreach (var grouping in Class.Students.GroupBy(s => ++i / 20))
Console.WriteLine("You belong to Group " + grouping.Key.ToString());
Solution 2:
For a similar problem I once made an extension method:
public static IEnumerable<IEnumerable<T>> ToChunks<T>(this IEnumerable<T> enumerable, int chunkSize)
{
int itemsReturned = 0;
var list = enumerable.ToList(); // Prevent multiple execution of IEnumerable.
int count = list.Count;
while (itemsReturned < count)
{
int currentChunkSize = Math.Min(chunkSize, count - itemsReturned);
yield return list.GetRange(itemsReturned, currentChunkSize);
itemsReturned += currentChunkSize;
}
}
Note that the last chunk may be smaller than the specified chunk size.
EDIT
The first version used Skip()/Take()
, but as Chris pointed out, GetRange
is considerably faster.