You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用更优雅的方式(含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

代码说明

  1. 获取元素索引:通过Select(Function(item, index))同时拿到每个元素及其对应的位置索引
  2. 按块分组:用index \ chunkSize做整数除法,结果相同的元素会被分到同一组,自然实现指定大小的分块
  3. 转换为子数组:对每个分组提取元素并转为数组,最终打包成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:01:14