如何在foreach循环中对迭代的元素进行分段
我需要遍历整个用户列表,但需要一次抓取20个。
foreach (var student in Class.Students.Take(20)) { Console.WriteLine("You belong to Group " + groupNumber); groupNumber++; }
这样,前20个将属于组1,第二个20属于组2,依此类推。
采取正确的语法吗? 我相信Take将花费20来完成。 谢谢!
你可以这样做:
int i = 0; foreach (var grouping in Class.Students.GroupBy(s => ++i / 20)) Console.WriteLine("You belong to Group " + grouping.Key.ToString());
对于类似的问题,我曾经做过一个扩展方法:
public static IEnumerable> ToChunks(this IEnumerable 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; } }
请注意,最后一个块可能小于指定的块大小。
编辑第一个版本使用了Skip()/Take()
,但正如克里斯指出的那样, GetRange
要快得多。
您可以使用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> Batch(this IEnumerable 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); } }
你可以像这样使用你的新扩展方法。
上述就是C#学习教程:如何在foreach循环中对迭代的元素进行分段分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
foreach (var batch in Class.Students.Batch(20)) { foreach (var student in batch) { Console.WriteLine("Student = " + student.Name); } }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1025879.html