-4

我是在 c# 中使用文件处理程序的新手。我已经完成了插入和搜索。请帮助我如何使用以下代码进行更新和删除。

用户界面部分::

 private void btnAdd1_Click(object sender, EventArgs e)
 {
     StudentManager sm = new StudentManager();
     sm.AddStudent(textName.Text,textId.Text,textDpt.Text,textSem.Text);
 }

 public void btnSearch1_Click(object sender, EventArgs e)
 {
        StudentManager sm = new StudentManager();
        Student s = sm.FindStudent(textId.Text);
        if (s != null)
        {
            this.textName.Text = s.GetName();
            this.textId.Text = s.ID;
            this.textDpt.Text = s.Department; 
            this.textSem.Text = s.GetSEM();              
        }
 }

验证::

   string id = String.Empty;
   public void SetName(string name)
   {
        if(!String.IsNullOrEmpty(name))
        {
            this.name = name;
        }
    }

    public string ID
    {
        get { return id; }
        set { id = value; }
    }

   string department = String.Empty;

    public string Department
    {
        get { return department; }
        set { department = value; }
    }

    string SEM= String.Empty;

    public void SetSEM(string sem)
    {
        if (!String.IsNullOrEmpty(sem))
        {
            this.SEM = sem;
        }
    }

    public string GetSEM()
    {
        return this.SEM;
    }
     public String GetName()
    {
        return this.name;
    }

}

学生经理::

class StudentManager
{    
    ArrayList students;
    const string FILENAME = @"d:\students.txt";

    public StudentManager()
    {
        SetStudentList();
    }

    private void SetStudentList()
    {
        if (students == null)
        {
            //create a file handler
            FileHandler sfh = new FileHandler();
            //initialize the teacher list object
            students = new ArrayList();

            //Now read all the lines from the teacher.txt
            //each line represent a teacher
            string[] studentfromfile = sfh.getAllLines(@FILENAME);
            int totalstudents = studentfromfile.Length;

            //go through each teacher and create teacher object to add it to the teacher list.
            for (int i = 0; i < totalstudents; i++)
            {
                string studentinfo = studentfromfile[i];
                string[] studentinfobroken = studentinfo.Split(new char[] { ',' });
                if (studentinfobroken.Length == 4)
                {
                    //this part is being duplicated - can think how?
                    Student s = new Student();
                    s.SetName(studentinfobroken[0]);
                    s.ID= studentinfobroken[1];
                    s.Department = studentinfobroken[2];
                    s.SetSEM(studentinfobroken[3]);
                    this.students.Add(s);
                }
            }
        }
    }

 public void AddStudent(string fullname, string ID, string dept,string Semester )
 {
        Student s = new Student();
        s.SetName(fullname);
        s.ID = ID;
        s.Department = dept;
        s.SetSEM(Semester);
        this.students.Add(s);
        FileHandler sfh = new FileHandler();
        string studentInfo = Environment.NewLine + s.GetName() + "," + s.ID + "," + s.Department + "," + s.GetSEM();
        sfh.AddLine(@FILENAME, studentInfo);
    }

   public Student FindStudent(string ID)
   {
        foreach (Student s in students)
        {
            if (s.ID.Equals(ID))
            {
                return s;
            }
        }
        return null;
    }

  class FileHandler
  {
    public String[] getAllLines(string fileName)
    {
        try
        {
            String[] lines = File.ReadAllLines(@fileName);
            return lines;
        }
        catch (Exception e)
        {
            throw e;
        }
    }

    public String GetAllText(string fileName)
    {
        try
        {
            String content = File.ReadAllText(@fileName);
            return content;
        }
        catch (Exception e)
        {
            throw e;
        }
    }

    public void AddLine(string filename, string line)
    {
        StreamWriter sr = null;
        try
        {
            sr = new StreamWriter(@filename, true);//true for append
            sr.WriteLine(line);
        }
        catch (Exception e)
        {
            throw e;
        }
        finally
        {
            sr.Close();
        }
    }
4

2 回答 2

2

好的,我查看了您的代码,看起来好像您在做每件小事后都更新了您的文本文件,这是错误的方法..(如果我错了,请减少示例中的代码以使其更易于阅读!)

您应该尝试做的是当您的程序加载时,将学生从文件加载到list学生中。然后,当您的程序持续存在时,您应该在需要的任何地方使用此列表。当您准备好关闭程序时,其写回文件。

除了明显的效率和易用性之外,这种方式的一个优点是可以取消更改,而不会破坏您唯一的学生副本。

例如

studentList.Remove(student) - Remove from list
studentList.Add(student) - add
studentList.Where(x => x.Name = "Joe"); - Filter
于 2013-08-02T21:30:50.693 回答
1

更新

studentfromfile[5] = "updated line";
File.WriteAllLines(FILENAME, studentfromfile);

删除

studentfromfile[5] = String.Empty;
studentfromfile = studentfromfile.Where(x => !String.IsNullOrEmpty(x)).ToArray();
File.WriteAllLines(FILENAME, studentfromfile);

有更好的方法来做到这一点,例如使用 Sayse 推荐的集合。您不应该使用 ArrayLists,如果您正在创建一个面向 .Net 2.0 及更高版本的项目(使用 List),则不需要它们,并且您不应该抛出这样的异常,因为您正在丢失堆栈跟踪。利用

try
{
   String content = File.ReadAllText(@fileName);
   return content;
}
catch (Exception e)
{
    throw; //not throw e;
}
于 2013-08-02T21:33:25.343 回答