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

如何基于条件拆分列表?用LINQ生成List<List<T>>分组结果

用LINQ实现以特定元素为起始点的列表分组

给定列表 [1,2,3,4,5,6,1,2,3,4,5,6,5,6],我们需要将其拆分为List<List<T>>,规则是每个值为1的元素作为分组起始点,包含该元素及后续所有元素直到下一个1出现(最后一组直接到列表末尾),预期得到两个子列表:

[1,2,3,4,5,6]
[1,2,3,4,5,6,5,6]

实现思路与代码

核心思路是先定位所有1的索引位置,再根据这些索引截取对应的子列表,用LINQ可以很简洁地完成:

// 原始列表
var originalList = new List<int> { 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6, 5, 6 };

// 第一步:获取所有值为1的元素的索引
var startIndices = originalList
    .Select((item, index) => new { Item = item, Index = index })
    .Where(x => x.Item == 1)
    .Select(x => x.Index)
    .ToList();

// 第二步:根据索引截取分组
var groupedLists = startIndices
    .Select((startIdx, idx) => 
    {
        // 确定当前分组的结束位置:下一个1的索引,或列表末尾
        int endIdx = idx < startIndices.Count - 1 ? startIndices[idx + 1] : originalList.Count;
        return originalList.GetRange(startIdx, endIdx - startIdx);
    })
    .ToList();

代码说明

  1. 定位起始索引:通过Select同时获取元素和其索引,筛选出值为1的元素的索引,这些索引就是每个分组的起始位置。
  2. 截取子列表:遍历每个起始索引,判断是否为最后一个起始点:
    • 若不是最后一个,结束位置为下一个1的索引;
    • 若是最后一个,结束位置为列表总长度,确保包含从该1到末尾的所有元素。
  3. 边界情况处理:如果原始列表中没有1,startIndices为空,最终结果也会是空列表;如果只有一个1,则直接返回从该1到列表末尾的子列表。

内容的提问来源于stack exchange,提问作者user2759713

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:16:17