在另一个类中的一个类内填充列表

本文关键字:一个 填充 列表 另一个 | 更新日期: 2023-09-27 18:00:21

我为这么简单的问题道歉,但我已经修复这个代码好几个小时了,无法取得任何进展。

我有一个项目需要使用三个类:客户、员工和客户组。类从文件(.csv)中填充,然后转储回控制台,显示其内容。客户组类,它包含员工类的一个实例和一个客户列表,以及处理两个类唯一变量的两个其他列表。在转储代码时,我会遇到一些未处理的异常错误,并且调试显示客户组类中的客户类为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 executive部分,但在一个类中填充一个类列表是我无法完全理解的。我认为我做得对,但我能找到的大多数例子都不太适合这种情况。我知道我的代码一点也不漂亮,但我只是想在开始清理之前建立基本功能。如有任何帮助或建议,我们将不胜感激。

编辑

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

System.NullReferenceException对象引用未设置为对象的实例。在"line"answers"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("--------------------------------");
    }

在另一个类中的一个类内填充列表

行DumpContents(customerGrp.Executive)递归地调用DumpContent方法-但使用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);
    ...
}

确保在程序循环之前初始化一个新的瞬间testGrp.Customers=新列表();

看起来你跳过了一个循环

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

我相信他之所以会出错,是因为他的客户对象从未实例化。通常情况下,DumpContents行不会出现错误,因为它是foreach循环,除非该对象在线程之间共享。您可能会在这一行的前一行得到错误:foreach(customerGrp.Customers中的Customer cust)

这就是为什么我要求他确保客户对象被实例化

但这只是我的猜测。。。