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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:24:03