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

C#如何分组填充Dictionary<string,List<Configuration>>类型字典

C# Dictionary分组构造实现方案

目标结构

需要构造的分组字典对应JSON结构如下:

{
  "Lifecycle": [
      {
          "default_value": "45",
          "group_name": "Lifecycle",
          "setting_value": "45",
          "setting_description": "Åldersavdrag gräns"
       },
       {
          "default_value": "2.5",
          "group_name": "Lifecycle",
          "setting_value": "2.5",
          "setting_description": "Åldersavdrag procent"
       }
  ],
  "Test": [
      {
          "default_value": "0",
          "group_name": "Test",
          "setting_value": "0",
          "setting_description": "Administration fee"
       }
  ]
}

原有代码问题

  • 字典对象在foreach循环内部实例化,每次循环都会生成全新的空字典,之前添加的键值对会全部丢失
  • 所有配置项都往同一个全局configs.configurations列表中添加,没有按group_name做分组隔离,最终字典所有键对应的都是同一个包含全部元素的列表
  • 循环内重复创建Configuration对象的操作完全冗余,直接使用遍历得到的config实例即可

正确实现方式

1. 实体类定义

多余的Configurations包装类可以直接删除,保留单条配置的实体类即可:

public class Configuration
{
  public string default_value { get; set; }
  public string group_name { get; set; }
  public string setting_value { get; set; }
  public string setting_description { get; set; }
}

2. 初始化配置列表

原有初始化配置项、添加到总列表的代码可以直接保留:

Configuration configuration1 = new Configuration()
{
  default_value = "45",
  group_name= "Lifecycle",
  setting_value= "45",
  setting_description= "Medicinsk invaliditet - Åldersavdrag gräns",
};

Configuration configuration2 = new Configuration()
{
  default_value = "2.5",
  group_name = "Lifecycle",
  setting_value = "2.5",
  setting_description = "Medicinsk invaliditet - Åldersavdrag procent"
};

Configuration configuration3 = new Configuration()
{
  default_value = "0",
  group_name = "Test",
  setting_value = "0",
  setting_description = "Administration fee",
};

List<Configuration> configurations = new List<Configuration>();
configurations.Add(configuration1);
configurations.Add(configuration2);
configurations.Add(configuration3);

3. 构造分组字典

字典实例必须放在循环外部初始化,遍历过程中按分组判断、追加元素:

// 字典在循环外初始化,避免每次循环重置内容
Dictionary<string, List<Configuration>> configurationDictionary = new Dictionary<string, List<Configuration>>();

foreach (Configuration config in configurations)
{
    // 判断当前分组是否已存在于字典中
    if (!configurationDictionary.ContainsKey(config.group_name))
    {
        // 不存在则新增键,对应初始化空列表
        configurationDictionary.Add(config.group_name, new List<Configuration>());
    }
    // 将当前配置项追加到对应分组的列表中
    configurationDictionary[config.group_name].Add(config);
}

如果使用LINQ,可以用更简洁的一行代码实现同等分组效果,不需要手动写循环:

// 需要先引入命名空间:using System.Linq;
var configurationDictionary = configurations.GroupBy(c => c.group_name)
                                            .ToDictionary(g => g.Key, g => g.ToList());

最终效果

运行代码后生成的字典和预期结构完全一致:

  • 键Lifecycle对应包含2条Lifecycle分组配置的列表
  • 键Test对应包含1条Test分组配置的列表
    不会出现所有配置项都堆在最后一个键下的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:51:30