我正在将控制器中的对象列表传递给Helper类中的函数,该函数将返回字典。然而,我得到的返回值总是什么都没有。我的对象列表工作正常,并且值存在,因此错误在helper类中。
这是我的控制器:
[HttpPost]
public ActionResult Form(List<Student> s)
{
var c = new HelperClass();
var result = c.helpermethod(s);
ViewBag.Result = s.Count; // RETURNS CORRECT LENGTH
ViewBag.Value = result.Count; // ALWAYS RETURN ZERO
return View("Index");
}
帮助类中的方法:
public Dictionary<Person,int> helpermethod(List<Student> s)
{
var result = new Dictionary<string, int>();
List<string> k = new List<string>();
List<int> v = new List<int>();
for (int i = 0; i < s.Count; i++)
{
var d = s[i];
if (k.Contains(d.Name)){
int index = k.FindIndex(a => a == d.Name);
v[index]+= d.Age;
}
else {
k.Append(d.Name);
v.Append(d.Age);
}
}
// Create Dictionary
for (int i = 0; i < k.Count; i++)
{
var p= new Person(k[i]) ;
result.Add(Person, v[i]);
}
return result;
}
Dictionary is Person Object:
public class Person
{
public string p { get; set; }
// Intializing class
public Person(string x)
{
p = x;
}
}
字典的键是一个学生对象:这是我的模型:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MVCModel.Models
{
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
}
主要问题在这个代码片段中:
else {
k.Append(d.Name);
v.Append(d.Age);
}
.Append()
是LINQ扩展方法,不修改对于原始集合,它只是返回一个新的IEnumerable
,并在末尾添加元素。这意味着k
和v
保持空,并且helpermethod
中的最后一个for循环永远不会运行。因为k
和v
是List
,所以使用.Add()
代替。或者更好,使用ToDictionary。
除此之外,我在你的代码中看到了更多的问题:
var result = new Dictionary<string, int>();
应该是Dictionary<Person, int>
,它甚至不应该像现在这样编译,因为它不匹配helpermethod
的返回类型。
result.Add(Person, v[i]);
应为result.Add(p, v[i]);
,Person
为类型。
首先,在代码中声明的Person
变量在哪里?
...
// Create Dictionary
for (int i = 0; i < k.Count; i++)
{
var p= new Person(k[i]) ;
result.Add(Person, v[i]); // <-- What is Person here?? Did you mean p?
}
其次,为什么不直接使用:
var res = s.ToDictionary(x => x.Name, x => x.Age);
没有必要重新发明轮子。
此外,为什么不扩展Person
类来保存年龄并返回List<Person>
而不是Dictionary<string, int>
呢?
:
public class Person
{
public string Name { get; set; }
public string Age { get; set; }
// Intializing class
public Person(string name, int age)
{
Name = name;
Age = age;
}
}
那么你可以这样使用:
...
var persons = s.Select(student => new Person(student.Name, student.Age);
ViewBag.Value = persons.Count();
更容易理解,更不容易出错。