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

如何按嵌套Enumerable属性使用GroupBy分组Activity数据

按嵌套属性GroupBy分组问题

数据结构

public class Activity
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<Business> Businesses { get; set; }
}

public class Business
{
    public int Id { get; set; }
    public string Name { get; set; }
}

现有数据

  • Activity 1
    • Business A
    • Business B
  • Activity 2
    • Business B
  • Activity 3
    • Business A

期望结果

  • Business A
    • Activity 1
    • Activity 3
  • Business B
    • Activity 1
    • Activity 2

问题

尝试了GroupBy与SelectMany/Select的多种组合,但始终无法正确实现分组映射。


解决方案

核心思路是先将Activity与对应的Business展开为一对多的关联项,再按Business分组,最后整理结构:

代码实现

// 假设activities是你的IEnumerable<Activity>数据源
var groupedResult = activities
    // 展开每个Activity和它的Business,生成(Activity, Business)的序列
    .SelectMany(activity => activity.Businesses.Select(business => new { activity, business }))
    // 按Business分组(如果Business的相等性判断有问题,建议按Id分组)
    .GroupBy(item => item.business)
    // 整理成期望的结构:每个组包含Business和对应的Activity列表
    .Select(group => new 
    {
        Business = group.Key,
        Activities = group.Select(item => item.activity).ToList()
    })
    .ToList();

注意事项

如果直接按Business对象分组时出现分组异常(比如同一个Business被分成多个组),说明Business类的相等性判断逻辑不符合预期,此时可以改为按Business.Id(唯一标识)分组,调整后的代码如下:

var groupedResult = activities
    .SelectMany(activity => activity.Businesses.Select(business => new { activity, business.Id, business.Name }))
    .GroupBy(item => new { item.Id, item.Name }) // 按Business的Id和Name分组,确保唯一性
    .Select(group => new 
    {
        Business = new Business { Id = group.Key.Id, Name = group.Key.Name },
        Activities = group.Select(item => item.activity).ToList()
    })
    .ToList();

内容的提问来源于stack exchange,提问作者trh88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:30:02