如何用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
相关产品推荐
相关产品推荐

