在另一个类中的一个类内填充列表
本文关键字:一个 填充 列表 另一个 | 更新日期: 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)
这就是为什么我要求他确保客户对象被实例化
但这只是我的猜测。。。