C# List<T>按字段分组转值为List<T>的Dictionary实现方法
问题背景
现有C#代码需要将List<Package>集合按Company字段分组,生成键为公司名称、值为对应公司下所有Package对象列表的字典结构:
- 测试数据共4条记录,其中
Company值为Adventure的记录有2条 - 最终生成的字典总条目数应为3
- 直接调用
ToDictionary(p => p.Company)会因存在重复键值抛出异常,自行编写的GroupBy实现存在语法错误无法运行
问题根因
ToDictionary方法默认要求传入的键选择器生成的键全局唯一,重复键会直接抛出ArgumentException,无法直接处理一对多的分组场景- 手写的
GroupBy代码存在两个问题:一是分组字段与实际实体属性不匹配(误用Source代替Company),二是存在多余的点号语法错误,且额外构造匿名对象的步骤属于冗余逻辑
正确实现
class Package { public string Company { get; set; } public double Weight { get; set; } public long TrackingNumber { get; set; } } public static void BuildCompanyPackageDict() { List<Package> packages = new List<Package> { new Package { Company = "Adventure", Weight = 25.2, TrackingNumber = 89453312L }, new Package { Company = "Lucerne Publishing", Weight = 18.7, TrackingNumber = 89112755L }, new Package { Company = "Wingtip Toys", Weight = 6.0, TrackingNumber = 299456122L }, new Package { Company = "Adventure", Weight = 33.8, TrackingNumber = 4665518773L } }; // 按公司分组生成字典 Dictionary<string, List<Package>> companyDict = packages .GroupBy(p => p.Company) .ToDictionary( g => g.Key, g => g.ToList() ); // 结果校验 // companyDict.Count == 3 // companyDict["Adventure"].Count == 2 }
实现说明
- 调用
GroupBy(p => p.Company)后,会返回IGrouping<string, Package>类型的集合,每个分组对象的Key属性对应分组的公司名称,分组本身是同公司下所有Package对象的可遍历集合 - 后续调用
ToDictionary时直接以分组Key为字典键,分组内元素转成的列表为字典值,不需要额外构造匿名类做中转,逻辑简洁无冗余 - 运行后可得到符合预期的3条字典记录,其中
Adventure对应的列表包含2条包裹数据
内容的提问来源于stack exchange,提问作者itmannz
相关产品推荐
相关产品推荐

