C# ASP.NET MVC调用Helper类返回Dictionary结果为空问题
问题根因
返回字典始终为空的核心原因是代码存在多处逻辑和语法错误,直接导致结果不符合预期:
- 列表元素添加方法使用错误:
List<T>添加元素应该调用Add()实例方法,你使用的Append()是LINQ扩展方法,该方法不会修改原列表对象,只会返回拼接元素后的新序列,你没有接收该返回值,因此k和v两个列表始终是空集合,后续构造字典的循环执行次数为0,最终返回的字典自然没有任何元素。 - 字典类型声明不匹配:方法签名标注返回类型为
Dictionary<Person, int>,但方法内初始化的是Dictionary<string, int>,二者类型不兼容,代码无法正常编译。 - 字典传参错误:构造字典时调用
result.Add(Person, v[i]),传入的第一个参数是类名Person而非你实例化的对象p,属于语法错误。 - 自定义类作为字典键缺少必要实现:如果直接用自定义类作为字典键,必须重写
Equals()和GetHashCode()方法,否则即使两个Person对象的p属性值完全一致,也会被判定为不同的键,引发后续逻辑错误。 - 额外问题:维护两个平行的
k、v列表通过索引对齐数据的写法非常容易出索引不匹配的bug,完全可以直接操作字典完成聚合,逻辑更简洁。
修正后代码
Helper类方法
public Dictionary<Person, int> helpermethod(List<Student> s) { var result = new Dictionary<Person, int>(); foreach (var student in s) { var personKey = new Person(student.Name); if (result.ContainsKey(personKey)) { result[personKey] += student.Age; } else { result.Add(personKey, student.Age); } } return result; }
Person类修正(重写相等判断方法)
public class Person { public string p { get; set; } public Person(string x) { p = x; } public override bool Equals(object obj) { return obj is Person other && p == other.p; } public override int GetHashCode() { return p?.GetHashCode() ?? 0; } }
替换以上代码后,返回的字典就可以正常统计同名Student的年龄总和,result.Count会返回正确的数值。
内容的提问来源于stack exchange,提问作者dap
相关产品推荐
相关产品推荐

