从 inFile 读取到列表<>

Reading from a inFile to a list<>

所以我有一个数据库程序,可以将数据从 .txt 文件读取到 class 对象中,然后将 class 的每个实例存储到一个列表中。但是在将第一个对象添加到列表中之后,添加的每个新对象都会用它的数据替换列表中的每个先前项目。所以列表中的每一项都是相同的。例如,如果我从 .txt 文件中读入 3 行:

listItem[0] = thirdInstance
listItem[1] = thirdInstance
listItem[2] = thirdInstance

如果我只读入一个项目,它工作正常,listItem[0] = firstInstance。

这是我的代码片段,它发生的地方,它编译得很好并且 运行s 没有 运行-time 错误,除了我提到的。

public void readFromFile()
{
    const string END = "ENDOFWRITE";
    const char DELIM = '|';
    const string fileName = "A1SepDB.txt";
    FileStream inFile = new FileStream(fileName, FileMode.Open, FileAccess.Read);
    StreamReader reader = new StreamReader(inFile);
    Customer temp = new Customer();
    string recordIn;
    string[] fields;
    recordIn = reader.ReadLine();
    while (recordIn != END)
    {
        fields = recordIn.Split(DELIM);
        temp.setFirstName(fields[0]);
        temp.setMiddleName(fields[1]);
        temp.setLastName(fields[2]);
        temp.setAddressLine1(fields[3]);
        temp.setAddressLine2(fields[4]);
        temp.setCity(fields[5]);
        temp.setState(fields[6]);
        temp.setZip(fields[7]);
        temp.setPhoneNumber(fields[8]);
        temp.setAccountType(fields[9]);
        temp.setCustomerSince(Convert.ToDateTime(fields[10]));
        temp.setNextServiceDate1(Convert.ToDateTime(fields[11]));
        temp.setNextServiceDate2(Convert.ToDateTime(fields[12]));
        temp.setNextServiceDate3(Convert.ToDateTime(fields[13]));
        temp.setNextServiceDate4(Convert.ToDateTime(fields[14]));
        ListViewItem listEntry = new ListViewItem();
        listEntry.Text = temp.getFirstName();
        listEntry.SubItems.Add(temp.getLastName());
        listEntry.SubItems.Add(temp.getPhoneNumber());
        CustomerListView.Items.Add(listEntry);
        CustomerList.Add(temp);
        recordIn = reader.ReadLine();
    }
    reader.Close();
    inFile.Close();
}

您需要在每次迭代中创建 Customer 的新实例。现在,您每次都在修改 相同的 实例,然后在列表中添加对它的另一个引用。

即使集合中有三个项目,它们都指向同一个 Customer 实例。

移动您的实例化,使其出现在 while 循环内:

while (recordIn != END)
{
    Customer temp = new Customer();
    ...

所有内容都引用同一个对象,因为您的 Customer temp = new Customer(); 在 while 循环之外。因此,每次将 "new" 客户添加到列表时,您实际上只是在更改所有列表项都引用的同一个客户对象。

Customer temp = new Customer(); 移到 while 循环中。

    while (recordIn != END)
    {
        Customer temp = new Customer();
        //Do stuff
        CustomerList.Add(temp);
        recordIn = reader.ReadLine();
    }
Customer temp = new Customer();

这不能在while循环之外

//Customer temp = new Customer(); //remove
string recordIn;
string[] fields;
recordIn = reader.ReadLine();
while (recordIn != END)
{
   Customer temp = new Customer();//add
}

您应该在循环内创建临时文件,如下所示:

public void readFromFile()
{
    const string END = "ENDOFWRITE";
    const char DELIM = '|';
    const string fileName = "A1SepDB.txt";
    FileStream inFile = new FileStream(fileName, FileMode.Open, FileAccess.Read);
    StreamReader reader = new StreamReader(inFile);

    string recordIn;
    string[] fields;
    recordIn = reader.ReadLine();
    while (recordIn != END)
    {
        Customer temp = new Customer();
        fields = recordIn.Split(DELIM);
        temp.setFirstName(fields[0]);
        temp.setMiddleName(fields[1]);
        temp.setLastName(fields[2]);
        temp.setAddressLine1(fields[3]);
        temp.setAddressLine2(fields[4]);
        temp.setCity(fields[5]);
        temp.setState(fields[6]);
        temp.setZip(fields[7]);
        temp.setPhoneNumber(fields[8]);
        temp.setAccountType(fields[9]);
        temp.setCustomerSince(Convert.ToDateTime(fields[10]));
        temp.setNextServiceDate1(Convert.ToDateTime(fields[11]));
        temp.setNextServiceDate2(Convert.ToDateTime(fields[12]));
        temp.setNextServiceDate3(Convert.ToDateTime(fields[13]));
        temp.setNextServiceDate4(Convert.ToDateTime(fields[14]));
        ListViewItem listEntry = new ListViewItem();
        listEntry.Text = temp.getFirstName();
        listEntry.SubItems.Add(temp.getLastName());
        listEntry.SubItems.Add(temp.getPhoneNumber());
        CustomerListView.Items.Add(listEntry);
        CustomerList.Add(temp);
        recordIn = reader.ReadLine();
    }
    reader.Close();
    inFile.Close();
}