如果数组元素与文本框匹配,则更新文件的行
Updating line of a file if array element matches text box
我有一种方法当前读取目录文件的所有行(每行 3 个字段),如果输入的扩展代码与文件中的扩展代码字段匹配,则用文本框条目的记录更新目录数组。
我将更新的目录数组显示为列表视图,当我尝试用更新的数组更新目录文件时,一切都变得糟糕了!编辑澄清:使用下面最新版本的代码,数组不再显示到列表视图,文件也没有更新。没有抛出任何错误。
public void updateName()
{
int count = 0;
string[] lines = File.ReadAllLines(directoryFile);
// Set size of directory array equal to number of lines in file
int lineCount = lineCounter();
directory = new record[lineCount];
record currentRecord = new record();
// Iterate through each line in file
foreach (string line in lines)
{
// Split current line into three fields
string[] fields = line.Split(',');
// Save current line as new record with surname, forename and extCode fields
currentRecord.surname = fields[0];
currentRecord.forename = fields[1];
currentRecord.extCode = Convert.ToInt32(fields[2]);
// If extension code in current record matches text box entry
if (Convert.ToInt32(fields[2]) == Convert.ToInt32(txtExtCode.Text))
{
// Change surname and forname fields to match text box entries
currentRecord.surname = txtForename.Text;
currentRecord.forename = txtSurname.Text;
using (StreamWriter writer = new StreamWriter(directoryFile))
{
for (int currentLine = 1; currentLine <= lines.Length; ++currentLine)
{
if (currentLine == count)
writer.WriteLine(currentRecord);
else
writer.WriteLine(lines[currentLine - 1]);
}
}
}
// Save currentRecord as next element in directory array, then increment
directory[count] = currentRecord;
count++;
}
}
您不需要 linecounter()
。行数为lines.Length
。
但是为什么需要这个 directory
数组呢?你正在填充它,但你没有在任何地方使用它。
另一个主要问题是您在 foreach
循环中创建了一个 StreamWriter
。您应该在循环之前打开文件并在循环之后关闭它以使其工作。
此外,您正在混合写入类型为 record
的 currentRecord
和将字符串类型的行写入输出文件。这行不通。
您还将 txtForename.Text
放入 currentRecord.surname
而不是 currentRecord.forename
,反之亦然。
我建议首先在 lines
数组中应用更改,然后使用 File.WriteAllLines
将此 lines
数组写回文件,这是对 [=24 的对称操作=].
我将更改直接应用于 fields
数组,以便我可以将其转换回具有 String.Join
的字符串(这是对 String.Split
的对称操作)。
public void updateName()
{
// Do this conversion before the loop. We need to do it only once.
int selectedCode = Convert.ToInt32(txtExtCode.Text);
string[] lines = File.ReadAllLines(directoryFile);
for (int i = 0; i < lines.Length; i++)
{
// Split current line into three fields
string[] fields = lines[i].Split(',');
int extCode = Convert.ToInt32(fields[2]);
if (extCode == selectedCode)
{
fields[0] = txtSurname.Text;
fields[1] = txtForename.Text;
lines[i] = String.Join(",", fields);
// If the extension code is unique, leave the for-loop
break;
}
}
File.WriteAllLines(directoryFile, lines);
}
我还使用 for
而不是 foreach
以获得索引 i
,这样我就可以在 lines
数组中替换一行具体指数.
不知道目录文件中的扩展代码是否唯一。如果是,您可以使用 break
.
提前退出 for 循环
我有一种方法当前读取目录文件的所有行(每行 3 个字段),如果输入的扩展代码与文件中的扩展代码字段匹配,则用文本框条目的记录更新目录数组。
我将更新的目录数组显示为列表视图,当我尝试用更新的数组更新目录文件时,一切都变得糟糕了!编辑澄清:使用下面最新版本的代码,数组不再显示到列表视图,文件也没有更新。没有抛出任何错误。
public void updateName()
{
int count = 0;
string[] lines = File.ReadAllLines(directoryFile);
// Set size of directory array equal to number of lines in file
int lineCount = lineCounter();
directory = new record[lineCount];
record currentRecord = new record();
// Iterate through each line in file
foreach (string line in lines)
{
// Split current line into three fields
string[] fields = line.Split(',');
// Save current line as new record with surname, forename and extCode fields
currentRecord.surname = fields[0];
currentRecord.forename = fields[1];
currentRecord.extCode = Convert.ToInt32(fields[2]);
// If extension code in current record matches text box entry
if (Convert.ToInt32(fields[2]) == Convert.ToInt32(txtExtCode.Text))
{
// Change surname and forname fields to match text box entries
currentRecord.surname = txtForename.Text;
currentRecord.forename = txtSurname.Text;
using (StreamWriter writer = new StreamWriter(directoryFile))
{
for (int currentLine = 1; currentLine <= lines.Length; ++currentLine)
{
if (currentLine == count)
writer.WriteLine(currentRecord);
else
writer.WriteLine(lines[currentLine - 1]);
}
}
}
// Save currentRecord as next element in directory array, then increment
directory[count] = currentRecord;
count++;
}
}
您不需要 linecounter()
。行数为lines.Length
。
但是为什么需要这个 directory
数组呢?你正在填充它,但你没有在任何地方使用它。
另一个主要问题是您在 foreach
循环中创建了一个 StreamWriter
。您应该在循环之前打开文件并在循环之后关闭它以使其工作。
此外,您正在混合写入类型为 record
的 currentRecord
和将字符串类型的行写入输出文件。这行不通。
您还将 txtForename.Text
放入 currentRecord.surname
而不是 currentRecord.forename
,反之亦然。
我建议首先在 lines
数组中应用更改,然后使用 File.WriteAllLines
将此 lines
数组写回文件,这是对 [=24 的对称操作=].
我将更改直接应用于 fields
数组,以便我可以将其转换回具有 String.Join
的字符串(这是对 String.Split
的对称操作)。
public void updateName()
{
// Do this conversion before the loop. We need to do it only once.
int selectedCode = Convert.ToInt32(txtExtCode.Text);
string[] lines = File.ReadAllLines(directoryFile);
for (int i = 0; i < lines.Length; i++)
{
// Split current line into three fields
string[] fields = lines[i].Split(',');
int extCode = Convert.ToInt32(fields[2]);
if (extCode == selectedCode)
{
fields[0] = txtSurname.Text;
fields[1] = txtForename.Text;
lines[i] = String.Join(",", fields);
// If the extension code is unique, leave the for-loop
break;
}
}
File.WriteAllLines(directoryFile, lines);
}
我还使用 for
而不是 foreach
以获得索引 i
,这样我就可以在 lines
数组中替换一行具体指数.
不知道目录文件中的扩展代码是否唯一。如果是,您可以使用 break
.