如何判断Dictionary<string,ComplexType>中是否存在指定Id用户并实现增改
代码修正方案
1. 先修复ComplexType类的笔误
原构造函数内赋值的IdUser和类定义的属性名Id不一致,先做统一:
public class ComplexType { public string Id { get; set; } public decimal Duration { get; set; } public ComplexType(string id, decimal duration) { // 原代码此处属性名拼写不匹配,修正为给公开属性Id赋值 Id = id; Duration = duration; } }
2. 调整业务逻辑
核心修改点:
- 把原有校验字典Key的逻辑,替换为查询字典
Values集合中是否存在对应Id的用户 - 修复原代码中未定义的
sc变量问题 - 匹配到用户直接累加时长,未匹配到则新增字典条目
public void GetUserPerFloor(TotalTimeViewModel model) { var users = getUsers(); foreach (var user in users) { // 从字典所有值中查找Id匹配的用户 var existUser = model.ListUserPerFloor.Values.FirstOrDefault(v => v.Id == user.Id); if (existUser == null) { // 不存在则新增,注意:如果当前用户的楼层已作为Key存在于字典中,会抛出重复Key异常,如有该场景可先判断Key是否存在再做更新 var sum = user.Duration.GetValueOrDefault(0m); model.ListUserPerFloor.Add(user.Floor.ToString(), new ComplexType(user.Id, sum)); } else { // 存在则累加时长 var sum = user.Duration.GetValueOrDefault(0m); existUser.Duration += sum; } } }
可选优化建议
如果你的实际业务是同一楼层下的同个用户需要累加时长,可以把字典结构优化为Dictionary<string, Dictionary<string, ComplexType>>,第一层Key为楼层号,第二层Key为用户Id,无需每次遍历全量Values做匹配,查询和更新效率更高。
内容的提问来源于stack exchange,提问作者Jock Jock
相关产品推荐
相关产品推荐

