使用新的值添加对象的新实例,而不使用C#

时间:2017-04-17 06:47:14

标签: c# xml list

所以我已经谷歌搜索了一段时间,并搜索了一些StackOverflow帖子,我必须遗漏一些东西。我正在使用C#进行一些XML解析,我有一系列类,如下所示。简而言之,“等级”课程包含“课堂”课程列表,课堂有“学生”列表和教师列表。

class Individual
{
   public string ID;
   public string fName;
   public string lName;
   public string gradeID;
}

class Classroom
{
   public string classID;
   public string className;
   public string classGrade;
   public int numTeachers;
   public List<Individual> Students;
   public List<Individual> Teachers;
}
class Grade
{
   public List<Classroom> Classrooms;
   public string classGrade;
}

基本上,在我的程序中,我筛选XML文件并收集学生和教师的列表,并将它们添加到我的教室,而不会覆盖任何一个。这是因为,在循环中,每次XML节点的名称等同于“student”或“teacher”时,我都会创建该类的新实例,因为该类型的新节点表示新的个体。你可以在这里看到:

// node is a student
else if (xmlReader.Name == "student")
{
    // create new student object
    Individual tempStudent = new Individual();
    tempStudent.ID = xmlReader.GetAttribute("id");
    tempStudent.fName = xmlReader.GetAttribute("first_name");
    tempStudent.lName = xmlReader.GetAttribute("last_name");
    tempStudent.gradeID = tempClassroom.classID;
    // add student object to classroom list of students
    tempClassroom.Students.Add(tempStudent); // classroom class is used inside student and teacher if statements
}

但是,我不能对课堂或年级做同样的事情,因为正如您在上面所看到的,学生和老师都依赖课堂课程进行存储。因此,我无法弄清楚如何创建一个新的教室对象,以便在我成绩时。添加(课堂)我可以开始修改教室而不修改成绩中已有的节点。而且,每次新教室出现时,我宁愿不必编写深层复制功能,因为这将非常缓慢。

编辑:示例XML文件: https://pastebin.com/XzSxgLdb

这段代码似乎解决了我的问题。当xmlNodeType是EndElement时,我检查了名称,然后根据需要创建了新的教室或新成绩。我没有任何覆盖,所以似乎已经清理了一切。

我觉得C#应该知道当你将一个对象添加到你想要保存该对象的容器时,所以C#应该为一个新对象创建一个新的引用。但我想情况并非如此。需要在每次需要时明确声明一个新对象。

case XmlNodeType.EndElement:
    if (xmlReader.Name == "classroom")
    {
        // at end of classroom element so add classroom to list
        tempClassroom.numTeachers = teacherCounter;
        grade.Classrooms.Add(tempClassroom);
        if (teacherCounter > highestNumberOfTeachers)   // collect the highest number of recorded teachers in a classroom
            highestNumberOfTeachers = teacherCounter;
        teacherCounter = 0;
        tempClassroom = new Classroom();
    }
    if (xmlReader.Name == "grade")
    {
        // at end of grade element so prepare for next grade level
        Grades.Add(grade);
        grade = new Grade();
    }

0 个答案:

没有答案