Linq按连续Country分组需求:实现列表连续同国家块分组
实现Linq连续相同Country的分块分组
嘿,这个需求我之前也碰到过!普通的GroupBy肯定满足不了,因为它会把所有同Country的元素都归到一起,不管它们在列表里是不是连续的。要实现连续相同Country的分块分组,咱们可以用两种Linq方案来搞定:
方案一:使用Aggregate累积分组
Aggregate是Linq里用来做累积计算的方法,刚好可以用来逐个构建连续分组:
首先先定义数据模型并初始化数据:
public class CountryData { public string Country { get; set; } public int Value { get; set; } public int Order { get; set; } } var dataList = new List<CountryData> { new() { Country = "France", Value = 45, Order = 1 }, new() { Country = "France", Value = 55, Order = 2 }, new() { Country = "Italy", Value = 105, Order = 3 }, new() { Country = "France", Value = 10, Order = 4 }, new() { Country = "Germany", Value = 11, Order = 5 }, new() { Country = "Germany", Value = 852, Order = 6 }, new() { Country = "Italy", Value = 26, Order = 7 } };
然后用Aggregate实现连续分组:
var consecutiveGroups = dataList.Aggregate( new List<List<CountryData>>(), // 初始值:空的分组列表 (currentGroups, currentItem) => { // 如果没有分组,或者最后一组的Country和当前元素不同,就新建分组 if (!currentGroups.Any() || currentGroups.Last().First().Country != currentItem.Country) { currentGroups.Add(new List<CountryData>()); } // 将当前元素加入最后一个分组 currentGroups.Last().Add(currentItem); return currentGroups; });
这个逻辑很直观:遍历每个元素时,检查最后一个分组的Country是否和当前元素一致,不一致就新建分组,然后把元素加进去,完美实现连续分块。
方案二:标记分组ID后再GroupBy
另一种思路是先给每个元素分配一个连续分组ID,每遇到不同的Country就递增ID,然后按ID分组:
int currentGroupId = 0; string lastCountry = null; var groupedResult = dataList .Select(item => { // 遇到新的Country,更新分组ID if (item.Country != lastCountry) { currentGroupId++; lastCountry = item.Country; } return new { Item = item, GroupId = currentGroupId }; }) .GroupBy(x => x.GroupId) // 按分组ID分组 .Select(g => g.Select(x => x.Item).ToList()) .ToList();
这种方式可读性也很强,先给元素打上分组标签,再用普通的GroupBy就能得到连续分组的结果。
验证结果
你可以遍历分组结果来验证:
foreach (var group in consecutiveGroups) { Console.WriteLine($"分组内容:{string.Join(" | ", group.Select(x => $"[{x.Country}] Value={x.Value}, Order={x.Order}"))}"); }
输出会完全符合你的预期:
- 分组内容:[France] Value=45, Order=1 | [France] Value=55, Order=2
- 分组内容:[Italy] Value=105, Order=3
- 分组内容:[France] Value=10, Order=4
- 分组内容:[Germany] Value=11, Order=5 | [Germany] Value=852, Order=6
- 分组内容:[Italy] Value=26, Order=7
内容的提问来源于stack exchange,提问作者bAN
相关产品推荐
相关产品推荐

