C# 比较字符串和文本文件

C# 比较字符串和文本文件,c#,string,string-comparison,C#,String,String Comparison,我目前正在编写一个代码,将一个学生添加到学生的文本文件中,并进行其他计算。我遇到的问题是,我必须将新生分类到文本文件中,以便他位于正确的位置 StreamWriter changeFile = new StreamWriter("Students.txt", true); if (pos > 0) { changeFile.Close(); } else { changeFile.WriteLine(newStudent); changeFile.Close();

我目前正在编写一个代码,将一个学生添加到学生的文本文件中,并进行其他计算。我遇到的问题是,我必须将新生分类到文本文件中,以便他位于正确的位置

StreamWriter changeFile = new StreamWriter("Students.txt", true);
if (pos > 0)
{
    changeFile.Close();
}
else
{
    changeFile.WriteLine(newStudent);
    changeFile.Close();
}

using (StreamReader streamReader = new StreamReader("Students.txt"))
{
    string text = streamReader.ReadToEnd();
}
到目前为止,我已经成功地将文本文件更改为字符串来比较2,但它位于错误的位置。我将使用什么代码使StreamWriter将newStudent字符串与文本文件进行比较,以便它可以将其按正确的顺序排列? 另外,文本文件中有超过10000名学生

以下是文本文件的前5行:

students (LIST
(LIST (LIST 'Abbott 'A_____ 'J ) 'NONE 'xxxxx@mail.usi.edu 2.3073320999676614 )
(LIST (LIST 'Abbott 'B_____ 'Y ) 'NONE 'xxxxx@mail.usi.edu 3.1915725161177115 )
(LIST (LIST 'Abbott 'R_____ 'Y ) 'NONE 'xxxxx@mail.usi.edu 3.448215586562192 )
(LIST (LIST 'Abel 'H_____ 'Y ) 'NONE 'xxxxx@mail.usi.edu 3.2517764202656974 )
 ) ) <- this is at the end
学生(列表)
(列表(列表“雅培”A“雅培”J)“无”xxxxx@mail.usi.edu 2.3073320999676614 )
(列表(列表'Abbott'B'uuuuuuuuuuuuuuuuy'Y)'NONE'xxxxx@mail.usi.edu 3.1915725161177115 )
(列表(列表'Abbott'R'uuuuuuuuuuuuuuuuuuuuuuuuy'Y)'NONE'xxxxx@mail.usi.edu 3.448215586562192 )
(列表(列表'Abel'H'uuuuuuuuuuuuuuuuuy'Y)'NONE'xxxxx@mail.usi.edu 3.2517764202656974 )
))简单的方法是:

  • 在换行符处拆分字符串
  • 创建包含源行的列表
  • 将新学生添加到列表中
  • 对列表排序
  • 将列表写入文件
  • 或者:

  • 在换行符处拆分字符串
  • 创建包含源行的列表
  • 将行写回文件,直到找到新记录的位置
  • 创造新纪录
  • 写下其余的记录 或者,更适合大文件:

  • 逐行读取源文件
  • 将行写入临时目标文件
  • 找到插入新记录的正确位置后,将其写入dest文件
  • 继续将行从源复制到目标
  • 删除源文件并重命名目标文件以替换其位置

  • 假设文本文件每行包含一个学生,您可以将文本文件读入字符串列表,然后添加新学生,然后对其排序并将其写回文件

    var allStudents = new List<string>(File.ReadAllLines("Students.txt"));
    allStudents.Add(newStudent);
    allStudents.Sort(allStudents);
    File.WriteLines("Students.txt", allStudents);
    
    然后像这样重新添加:

    var line = allStudents[0];
    allStudents.RemoveAt(0);
    
    allStudents.Insert(0, line);
    
    差不多

    var Students = File.ReadAllText("Students.txt").Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).ToList().Union(new string[] { newStudent }).ToList().Sort();
    File.WriteAllLines("Students.txt", Students);
    

    可能适合您

    如果可能的话,我建议您使用数据库…为什么您只使用基于文本文件的解决方案?请向我们展示您的文本文件示例,包括您正在使用的任何轮廓。我刚刚修改了您示例中的数据,不确定其中一些号码是什么,但他们所联系的人可能会在意。事实上,所有的号码、电子邮件和姓名都是假的。所以他们会在乎,如果他们是真的,哈海设法把台词分开,但我无法把它变成一个简单的列表<代码>变量行=stringFromFile.Split(…).ToList()。您还需要为
    System.Linq
    名称空间添加一个using语句。我设法使它工作,但我只能运行一次,每当它将行0添加回来时,它会在后面放一个空行,这会导致它在第二次运行时出错,并且在代码末尾有),您知道如何删除它吗?我可以把它写回修复空行,change
    var line=allStudents[0]
    to
    var line=allStudents[0].Trim()
    要删除最后一行,请执行以下操作:
    var lastLine=allStudents[allStudents.Count-1].Trim()
    要向后添加最后一行,请执行:
    allStudents.add(lastLine)我拿不到最后一部分。当我运行它时,我检查文本文件,最后一部分总是切入代码的其余部分。我不明白你的意思。“切入代码的其余部分”是什么意思?“检查文本文件”是什么意思?在对列表进行排序之前,应该删除第一行和最后一行。然后在保存文件之前将它们都添加回去。