您可以使用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);
}
}