如何使用LINQ将对象列表拆分为连续元素组成的子列表?
基于LINQ的连续序列拆分实现
你可以通过GroupBy方法非常简洁地实现需求,核心逻辑是给每一段连续序列分配同一个分组标识,遇到断开的情况就更新分组标识,实现代码如下:
List<Item[]> GetContiguousSequences(Item[] items) { int groupId = 0; int? lastStop = null; return items .GroupBy(item => { // 遇到不连续的情况就进入新分组 if (lastStop.HasValue && item.Start != lastStop.Value) groupId++; lastStop = item.Stop; return groupId; }) .Select(group => group.ToArray()) .ToList(); }
实现说明
- 用闭包变量
groupId记录当前分组的编号,lastStop存储上一个元素的Stop值用来判断连续性 - 遍历每个元素时如果当前元素的
Start和上一个的Stop不匹配,就将分组编号加1,进入新的连续序列分组 - 最终将每个分组的元素转为数组,再封装为List返回,完全符合要求的输出格式
这个版本没有冗余的下标维护、切片计算逻辑,规则直接体现在分组判断中,可读性远高于原始的循环实现,用示例输入测试可以得到完全符合预期的输出。
内容的提问来源于stack exchange,提问作者Mr. Boy
相关产品推荐
相关产品推荐

