从 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();
}
所以我有一个数据库程序,可以将数据从 .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();
}