如何使用LINQ对有序整数数组进行分组?
使用LINQ实现有序连续整数数组分组
当然可以用LINQ搞定这个需求!而且这个实现思路还挺巧妙的,核心是利用连续整数的索引与数值的差值恒定这个特性来完成分组。
实现思路
先给你掰扯下原理:对于连续递增的整数序列,比如1,2,3,4,5,每个元素的索引i减去对应数值x的结果是固定不变的:
- 1的索引是0 → 0-1 = -1
- 2的索引是1 → 1-2 = -1
- ...
- 5的索引是4 → 4-5 = -1
而当序列断开时,比如9的索引是5 → 5-9 = -4,这个差值和前面的-1不一样,刚好可以用这个差值作为分组的key,把连续的整数自动归到同一组里。
完整LINQ代码
int[] numbers = {1, 2, 3, 4, 5, 9, 10, 11, 13}; var groups = numbers .Select((x, i) => new { Difference = i - x, Value = x }) .GroupBy(item => item.Difference) .Select(group => group.Select(item => item.Value).ToList()) .ToList();
代码逐行解释
Select((x, i) => new { Difference = i - x, Value = x }):遍历数组时,同时拿到每个元素的值x和它的索引i,计算出索引与值的差值,把这两个信息打包成匿名对象。GroupBy(item => item.Difference):以计算出的差值作为分组依据,所有差值相同的元素会被分到同一组——这正好就是我们要的连续整数序列。Select(group => group.Select(item => item.Value).ToList()):把每个分组里的匿名对象提取出数值部分,转成List<int>,最后把所有分组汇总成一个List<List<int>>,就是你要的结果啦。
对比你原来的for循环写法,这种LINQ实现更简洁,也更贴合函数式编程的风格~
内容的提问来源于stack exchange,提问作者HelloWorld
相关产品推荐
相关产品推荐

