如何用更优雅的方式(含LINQ)拆分数组为指定大小的子数组?
批量订单拆分的LINQ实现方案
问题背景
开发批量创建订单程序时受API限制,每次仅能处理10个订单。递归拆分大数组(如100条)会引发栈溢出,已实现O(n)复杂度的循环拆分函数,希望用LINQ(Take、Skip、GroupBy等)实现更简洁优雅的数组拆分,例如将{1,2,3,...,12}拆分为指定大小的子数组。
现有循环拆分函数代码:
Public Shared Function splitArrayIntoSmallerArrays(Of someObject)(arrayOfSomeObject As someObject(), chunkSize As Integer) As List(Of someObject()) Dim output = New List(Of someObject()) Dim newestArray = New List(Of someObject) For i = 0 To arrayOfSomeObject.Count - 1 newestArray.Add(arrayOfSomeObject(i)) If newestArray.Count = chunkSize Then output.Add(newestArray.ToArray) newestArray = New List(Of someObject) End If Next output.Add(newestArray.ToArray) Return output End Function
LINQ实现方案
可以利用GroupBy结合元素索引来实现简洁分块,核心思路是通过整数除法将同组元素归类,一行LINQ逻辑即可完成分块:
Public Shared Function SplitWithLinq(Of T)(source As T(), chunkSize As Integer) As List(Of T()) If chunkSize <= 0 Then Throw New ArgumentOutOfRangeException(NameOf(chunkSize)) Return source.Select(Function(item, index) New With {item, index}) .GroupBy(Function(x) x.index \ chunkSize) .Select(Function(g) g.Select(Function(x) x.item).ToArray()) .ToList() End Function
代码说明
- 获取元素索引:通过
Select(Function(item, index))同时拿到每个元素及其对应的位置索引 - 按块分组:用
index \ chunkSize做整数除法,结果相同的元素会被分到同一组,自然实现指定大小的分块 - 转换为子数组:对每个分组提取元素并转为数组,最终打包成List返回
这个实现和循环函数复杂度一致(O(n)),但代码更紧凑,可读性更强,完全基于LINQ语法实现。
调用示例
拆分包含12个元素的数组,指定每块大小为10:
Dim testArray = Enumerable.Range(1, 12).ToArray() Dim chunks = SplitWithLinq(testArray, 10) ' 结果将得到两个子数组:{1,2,...,10} 和 {11,12}
优势对比
该实现是迭代式逻辑,不会像递归方案那样因数组过大触发栈溢出,同时代码更简洁,符合优雅实现的需求。
内容的提问来源于stack exchange,提问作者user4951
相关产品推荐
相关产品推荐

