我有一个文本文件,我试图插入一行代码。使用我的链接列表我相信我可以避免必须取出所有数据,对其进行排序,然后将其转换为新的文本文件。 我所做的是提出下面的代码。我设置了bool,但它仍然没有用。我经历了调试器,它似乎正在进行的是它正在通过整个列表(大约10,000行)并且它没有找到任何真实的东西,因此它不会插入我的代码。
此代码的原因或错误是什么?
List<string> lines = new List<string>(File.ReadAllLines("Students.txt"));
using (StreamReader inFile = new StreamReader("Students.txt", true))
{
string newLastName = "'Constant";
string newRecord = "(LIST (LIST 'Constant 'Malachi 'D ) '1234567890 'mdcant@mail.usi.edu 4.000000 )";
string line;
string lastName;
bool insertionPointFound = false;
for (int i = 0; i < lines.Count && !insertionPointFound; i++)
{
line = lines[i];
if (line.StartsWith("(LIST (LIST "))
{
values = line.Split(" ".ToCharArray());
lastName = values[2];
if (newLastName.CompareTo(lastName) < 0)
{
lines.Insert(i, newRecord);
insertionPointFound = true;
}
}
}
if (!insertionPointFound)
{
lines.Add(newRecord);
}
答案 0 :(得分:4)
您只是将文件读入内存而不是将其提交到任何地方。
我担心您将不得不加载并完全重写整个文件。文件支持附加,但它们不支持插入。
您可以按照与其相同的方式写入文件
string[] lines;
/// instanciate and build `lines`
File.WriteAllLines("path", lines);
WriteAllLines
也需要IEnumerable
,因此如果您愿意,可以将List
字符串传入其中。
还有一个问题:看起来好像您正在阅读两次文件。一个ReadAllLines
,另一个StreamReader
。
答案 1 :(得分:2)
至少有四种可能的错误。
要检查两个字符串是否相等,您应该避免使用CompareTo 在上面的MSDN链接中解释但使用string.Equals
List<string> lines = new List<string>(File.ReadAllLines("Students.txt"));
string newLastName = "'Constant";
string newRecord = "(LIST (LIST 'Constant 'Malachi 'D ) '1234567890 'mdcant@mail.usi.edu 4.000000 )";
string line;
string lastName;
bool insertionPointFound = false;
for (int i = 0; i < lines.Count && !insertionPointFound; i++)
{
line = lines[i].Trim();
if (line.StartsWith("(LIST (LIST "))
{
values = line.Split(" ".ToCharArray());
lastName = values[2];
if (newLastName.Equals(lastName))
{
lines.Insert(i, newRecord);
insertionPointFound = true;
}
}
}
if (!insertionPointFound)
lines.Add(newRecord);
我没有将错误的写回错误列为错误。希望你刚刚省略了那部分代码。否则这是一个非常简单的问题。
(但我认为使用CompareTo
的方式可能是你问题的主要原因)
编辑查看下面的评论,Sam I Am
的答案似乎适合您。当然,您需要回写修改后的行数组。如果您没有写入文件的代码,则对内存中的行数组进行所有更改,并且不会将任何内容写回文件。但是,您不需要新文件
File.WriteAllLines("Students.txt", lines);