从Helper类传递值时不返回任何值



我正在将控制器中的对象列表传递给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,并在末尾添加元素。这意味着kv保持空,并且helpermethod中的最后一个for循环永远不会运行。因为kvList,所以使用.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();

更容易理解,更不容易出错。

相关内容

  • 没有找到相关文章

最新更新