如何基于条件拆分列表?用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();
代码说明
- 定位起始索引:通过
Select同时获取元素和其索引,筛选出值为1的元素的索引,这些索引就是每个分组的起始位置。 - 截取子列表:遍历每个起始索引,判断是否为最后一个起始点:
- 若不是最后一个,结束位置为下一个
1的索引; - 若是最后一个,结束位置为列表总长度,确保包含从该
1到末尾的所有元素。
- 若不是最后一个,结束位置为下一个
- 边界情况处理:如果原始列表中没有
1,startIndices为空,最终结果也会是空列表;如果只有一个1,则直接返回从该1到列表末尾的子列表。
内容的提问来源于stack exchange,提问作者user2759713
相关产品推荐
相关产品推荐

