Вы можете проецировать номер группы на каждый элемент в исходном списке, используя Select
и анонимный тип, подобный этому:
var assigned = Class.Students.Select(
(item, index) => new
{
Student = item,
GroupNumber = index / 20 + 1
});
Затем вы можете использовать его следующим образом:
foreach (var item in assigned)
{
Console.WriteLine("Student = " + item.Student.Name);
Console.WriteLine("You belong to Group " + item.GroupNumber.ToString());
}
Или если вы хотите выделить определенную группу.
foreach (var student in assigned.Where(x => x.GroupNumber == 5))
{
Console.WriteLine("Name = " + student.Name);
}
Или если вы хотите на самом деле сгруппировать их для выполнения агрегатов
foreach (var group in assigned.GroupBy(x => x.GroupNumber))
{
Console.WriteLine("Average age = " + group.Select(x => x.Student.Age).Average().ToString());
}
Теперь, если вы просто хотите объединитьэлементы в партиях, и вам не нужно иметь информацию о номере партии, вы можете создать этот простой метод расширения.
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);
}
}
И вы можете использовать свой новый метод расширения следующим образом.
foreach (var batch in Class.Students.Batch(20))
{
foreach (var student in batch)
{
Console.WriteLine("Student = " + student.Name);
}
}