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

