在另一个类中的类中填充List

时间:2013-02-19 23:52:21

标签: c# list class population

我为这么简单的问题道歉,但我一直在努力修复这段代码几个小时,我无法取得任何进展。

我有一个项目要求使用三个类:客户,员工和客户组。这些类从文件(.csv)填充,然后转储回显示其内容的控制台。客户组类,包含员工类的单个实例和客户列表以及处理几个类唯一变量的其他几个列表。转储我的代码时,我得到一些Unhandled Exception错误,并且调试显示客户组类中的customer类为null。据我所知,可能存在一系列其他问题,但是填写这个类的列表就是问题所在。

代码本身很长,所以为了简洁起见,我会尝试修剪它。

有问题的程序位:

while (dataArray[i] == "End")
        {
            int.TryParse(dataArray[i], out temp);
            i++;
            testGrp.Customers.Add(new Customer(temp, dataArray[i++], dataArray[i++], dataArray[i++], dataArray[i++]));
            double.TryParse(dataArray[i], out doubleTemp);
            testGrp.AmountSpent.Add(doubleTemp);
            i++;
            testGrp.SpendingLevel.Add(dataArray[i]);
            i++;
        }

客户群班:

public CustomerGrp(int groupId, Employee executive, List<Customer> customers,   List<double> amountSpent, List<string> spendingLevel)
    {
        this.groupId = groupId;
        this.executive = executive;
        this.customers = customers;
        this.amountSpent = amountSpent;
        this.spendingLevel = spendingLevel;
    }

客户类:

public Customer(int newId, string newName, string newPhoneNumber, string newAddress, string newMarried)
    {
        this.Id = newId;
        this.Name = newName;
        this.PhoneNumber = newPhoneNumber;
        this.Address = newAddress;
        this.Married = newMarried;
    }

dataArray是通过将csv文件中的初始字符串分成较小的位而生成的数组。它不漂亮,但现在它的目的。在此之前,已经处理了groupID和执行位,以i ++结束,为显示的部分做准备。

我可以在没有错误的情况下填充Employee执行部分,但是在类中填充类列表是我无法理解的。我想我做得对,但我能找到的大多数例子都不太适合这种情况。我知道我的代码不是很漂亮,但我只是在开始清理之前尝试建立基本功能。任何帮助或建议将不胜感激。

修改

根据要求,控制台中给出的消息如下:

System.NullReferenceException对象引用未设置为对象的实例。在'line'和'line'。

这些行是:

DumpContents(testGrp);

static void DumpContents(CustomerGrp customerGrp)
    {
        Console.WriteLine("------- Customer Content -------");
        Console.WriteLine("         Id: {0}", customerGrp.GroupId);
        DumpContents(customerGrp.Executive);
        foreach (Customer cust in customerGrp.Customers)
        {
            DumpContents(cust); // <- Exception Error line here
        }
        Console.WriteLine("--------------------------------");
    }

修改

包含重载的DumpContents函数:

static void DumpContents(Employee employee)
     {
        Console.WriteLine("------- Employee Content -------");
        Console.WriteLine("         Id: {0}", employee.Id);
        Console.WriteLine("       Name: {0}", employee.Name);
        Console.WriteLine(" Start Date: {0}", employee.StartDate);
        Console.WriteLine("       Rate: {0}", employee.GetRate());
        Console.WriteLine("      Hours: {0}", employee.GetHours());
        Console.WriteLine("        Pay: {0}", employee.CalcPay());
        Console.WriteLine("     Tenure: {0} Years", employee.GetTenure());
        Console.WriteLine("--------------------------------");
    }

    static void DumpContents(Customer customer)
    {
        Console.WriteLine("------- Customer Content -------");
        Console.WriteLine("            Id: {0}", customer.Id);
        Console.WriteLine("          Name: {0}", customer.Name);
        Console.WriteLine("  Phone Number: {0}", customer.PhoneNumber);
        Console.WriteLine("       Address: {0}", customer.Address);
        Console.WriteLine("Marital Status: {0}", customer.Married);
        Console.WriteLine("--------------------------------");
    }

2 个答案:

答案 0 :(得分:0)

行DumpContents(customerGrp.Executive)以递归方式调用DumpContents方法 - 但是使用Employee类型,然后再次使用Customer类型循环。 DumpContents必须传递给CustomerGrp。

简单修复就是重载DumpContents方法以转储不同类型的信息,例如:

static void DumpContents(CustomerGrp customerGrp)
{
    Console.WriteLine("------- Customer Content -------");
    Console.WriteLine("         Id: {0}", customerGrp.GroupId);
    DumpContents(customerGrp.Executive);
    foreach (Customer cust in customerGrp.Customers)
    {
        DumpContents(cust); // <- Exception Error line here
    }
    Console.WriteLine("--------------------------------");
}


static void DumpContents(Employee employee)
{
    Console.WriteLine("------- Employee Content -------");
    Console.WriteLine("         Id: {0}", employee.Id);
    ...
}


static void DumpContents(Customer customer)
{
    Console.WriteLine("------- CustomerContent -------");
    Console.WriteLine("         Id: {0}", customer.Id);
    ...
}

答案 1 :(得分:0)

确保在程序循环之前初始化新的瞬间 testGrp.Customers = new list();

好像你在循环中跳过一个

编辑:哇,你很好,你知道我在用手机回答这个问题。

我相信他正在收到错误,因为他的客户对象从未实例化过。通常,您不会在DumpContents行上获得错误,因为它是一个foreach循环,除非该对象在线程之间共享。您可能会在此行的前一行中收到错误:foreach(customer cust in customerGrp.Customers)

这就是我要求他确保客户对象被实例化的原因

但那只是我的猜测......