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

如何用LINQ或对象映射器实现扁平记录转嵌套分组结构?

问题描述

现有如下记录列表:

{User = "UserName1", Car = "BMW", CarModel = "i3", Plate = "ExamplePlate1"},
{User = "UserName2", Car = "BMW", CarModel = "i3", Plate = "ExamplePlate2"},
{User = "UserName3", Car = "BMW", CarModel = "i8", Plate = "ExamplePlate3"},
{User = "UserName4", Car = "Audi", CarModel = "rs4", Plate = "ExamplePlate4"},
{User = "UserName5", Car = "Ford", CarModel = "Mustang", Plate = "ExamplePlate5"},
{User = "UserName6", Car = "Ford", CarModel = "Edge", Plate = "ExamplePlate6"}

希望转换为如下嵌套分组结构:

{
Car = "BMW", 
       CarModel = {
              {CarModel = "i3", 
                            Users = {
                                   {Name = "UserName1", Plate = "ExamplePlate1"},
                                   {Name = "UserName2", Plate = "ExamplePlate2"}
                            },
              },
              {CarModel = "i8", 
                            Users = {
                                   {Name = "UserName3", Plate = "ExamplePlate3"}
                            },
              },
       },      
},
{
       Car = "Ford",
       CarModel = {
              {CarModel = "Mustang", 
                            Users = {
                                   {Name = "UserName5", Plate = "ExamplePlate5"}
                            },
              },
              {CarModel = "Edge", 
                            Users = {
                                   {Name = "UserName6", Plate = "ExamplePlate6"}
                            },
              },
       },    
}
// ...其他品牌

目前通过三层嵌套foreach实现了需求,但想优化实现方式,询问是否可以通过LINQ或对象映射器来实现?


解决方案:用LINQ实现嵌套分组

完全可以用LINQ的分组语法实现,代码更简洁可读性更强,无需嵌套foreach。

1. 定义对应的数据实体类

// 原始数据实体
public class UserCarRecord
{
    public string User { get; set; }
    public string Car { get; set; }
    public string CarModel { get; set; }
    public string Plate { get; set; }
}

// 分组后的用户信息
public class UserPlateInfo
{
    public string Name { get; set; }
    public string Plate { get; set; }
}

// 按车型分组的结构
public class CarModelGroup
{
    public string CarModel { get; set; }
    public List<UserPlateInfo> Users { get; set; }
}

// 最终按品牌分组的结构
public class CarBrandGroup
{
    public string Car { get; set; }
    public List<CarModelGroup> CarModels { get; set; }
}

2. LINQ嵌套分组实现代码

List<UserCarRecord> originalRecords = new List<UserCarRecord>
{
    new UserCarRecord { User = "UserName1", Car = "BMW", CarModel = "i3", Plate = "ExamplePlate1" },
    new UserCarRecord { User = "UserName2", Car = "BMW", CarModel = "i3", Plate = "ExamplePlate2" },
    new UserCarRecord { User = "UserName3", Car = "BMW", CarModel = "i8", Plate = "ExamplePlate3" },
    new UserCarRecord { User = "UserName4", Car = "Audi", CarModel = "rs4", Plate = "ExamplePlate4" },
    new UserCarRecord { User = "UserName5", Car = "Ford", CarModel = "Mustang", Plate = "ExamplePlate5" },
    new UserCarRecord { User = "UserName6", Car = "Ford", CarModel = "Edge", Plate = "ExamplePlate6" }
};

var groupedResult = originalRecords
    .GroupBy(r => r.Car) // 第一层:按汽车品牌分组
    .Select(brandGroup => new CarBrandGroup
    {
        Car = brandGroup.Key,
        CarModels = brandGroup
            .GroupBy(r => r.CarModel) // 第二层:按车型分组
            .Select(modelGroup => new CarModelGroup
            {
                CarModel = modelGroup.Key,
                Users = modelGroup
                    .Select(userRecord => new UserPlateInfo
                    {
                        Name = userRecord.User,
                        Plate = userRecord.Plate
                    })
                    .ToList()
            })
            .ToList()
    })
    .ToList();

3. 补充说明

  • LINQ的GroupBy可连续调用实现多层嵌套分组,逻辑和三层foreach一致,但代码更紧凑。
  • 若使用AutoMapper这类对象映射器,可先完成分组再映射到目标结构,但对于这种简单的分组+投影场景,直接用LINQ的Select投影更直接,无需额外引入映射器。
  • 最终的groupedResult就是你期望的嵌套结构,可直接使用或序列化输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:57:06