WPF中给集合分块 1. 核心概念Chunk()是从.NET 6开始引入的一个 LINQ 扩展方法。它的作用非常直接将一个大型集合如数组、List按指定的固定大小分割成多个小的“数据块”或批次。命名空间System.Linq适用对象任何实现了IEnumerableT的集合包括数组和 List。完美替代以往我们需要手写for循环加Skip()和Take()来分页或者写自定义的SplitArrayWithCount方法现在可以直接用原生方法替代。2. 基础语法与返回值语法publicstaticIEnumerableTSource[]ChunkTSource(thisIEnumerableTSourcesource,intsize);返回值解析返回类型是IEnumerableT[]即一个包含数组的可枚举集合。每一个“块”本身就是一个标准的数组T[]。它是延迟执行的只有在真正迭代如foreach时才会开始分割。3. 基础代码示例int[]numbers{1,2,3,4,5,6,7};// 按每块大小为 3 进行分割int[][]chunksnumbers.Chunk(3).ToArray();/* chunks 结果如下 chunks[0] { 1, 2, 3 } chunks[1] { 4, 5, 6 } chunks[2] { 7 } -- 注意最后一块不足3个但依然独立成块 */4. 重要特性与边界情况最后一块可能小于指定大小如果原集合的长度不能被size整除最后一个块会包含剩下的所有元素如上面的{ 7 }。参数校验如果传入的size小于或等于 0会抛出ArgumentOutOfRangeException异常。空集合安全如果原集合为空Chunk()不会抛出异常而是返回一个空的可枚举对象迭代时不会进入循环体。5. 实际应用场景结合你的批量翻译任务最典型的应用场景是批量网络请求或数据库批量插入。// 直接将 10000 条数据分成每份 50 条varoneinfoInfos.Chunk(50);foreach(variteminoneinfo)// item 是一个数组如 string[50]{// item.Length 可以获取当前批次的真实数量Console.WriteLine($当前处理{item.Length}条数据);// 将这 50 条数据发送给翻译 APIawaitPostAsync(item);}6. 性能考量与进阶对比优点代码极简原生的、微软官方实现无需自己造轮子。内存分配明确每次 yield 返回一个定长的小数组内存开销可控。注意点与高性能切片SpanT的对比Chunk()会在堆上创建新的数组对象。对于一般的业务逻辑如处理 10 万条数据完全没有问题。但如果你的集合达到几百万甚至上千万级别且对内存极度敏感频繁创建小数组会增加 GC垃圾回收压力。极致性能替代方案仅限纯数组T[]如果处理超大纯数组可用MemoryT或SpanT进行零内存分配切片// 假设 array 是 T[]for(inti0;iarray.Length;i50){intlengthMath.Min(50,array.Length-i);// 获取切片不产生新数组直接指向原内存MemoryTslicearray.AsMemory(i,length);// 处理 slice...}7. 笔记总结是什么.NET 6 自带的 LINQ 方法用于将大集合切成固定大小的块。怎么用collection.Chunk(大小)在foreach中迭代。注意啥最后一块可能尺寸较小会产生小数组对象的内存分配。

本月热点