Home > Back-end >  Returns nothing when passing value back from Helper Class
Returns nothing when passing value back from Helper Class

Time:06-22

I am passing a list of objects from the Controller to a function in a Helper Class which is to return a dictionary back. However, the return value I am getting is always nothing. My list of objects works fine and the values are present so the error is in the helper class.

This is my Controller:

[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");
        }

Method in my Helper Class :

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;
        }
    }
Key of Dictionary is a Student Object:

This is my model:

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; }
    }
}

CodePudding user response:

First off, where is the Person variable declared in your code?

...
            // 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?
            }

Secondly, why not just use:

var res = s.ToDictionary(x => x.Name, x => x.Age);

No need to reinvent the wheel.

Furthermore, why not expand the Person class to hold the age and return a List<Person> instead of a Dictionary<string, int>?

Like this:

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;
        }
    }

Then you can use it like this:

...
var persons = s.Select(student => new Person(student.Name, student.Age);

ViewBag.Value = persons.Count();

it's much easier to understand and is less error-prone.

CodePudding user response:

The main issue is in this snippet:

else {
    k.Append(d.Name);  
    v.Append(d.Age);
}

.Append() is a LINQ extension method which does not modify the original collection, it simply returns a new IEnumerable with the added element at the end. That means that k and v stay empty, and the last for-cycle in helpermethod never runs. Since k and v are List, use .Add() instead. Or even better, use ToDictionary.

Other than that, I see a few more issues in your code:

var result = new Dictionary<string, int>();

should be Dictionary<Person, int>, it shouldn't even compile as it is, since it does not match the return type of helpermethod.

result.Add(Person, v[i]);

should be result.Add(p, v[i]);, Person is a type.

  • Related