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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:12:28