首页 > 解决方案 > 如何删除输出列表中的重复项?

问题描述

我对 c# 很陌生,并且正在编写一项任务,即输出年份、每年学习的课程以及上过该课程的学生。我从包含所有信息的外部文件中获取此信息。当我尝试输出这些值时,我得到了一门在 2 个不同年份上过的课程,但是学生们在这两年都出现了,而他们只上过一次。

foreach (Years y in year2)
{
    Console.WriteLine("Year: {0}", y.gYear);

    foreach (Classes c in class2)
    {
        if (y.gYear == c.gYear)
        {
            Console.WriteLine("Class: {0}", c.gCourse);

            foreach (Grades g in grade2)
            {
                if (g.gCourse == c.gCourse )
                {
                    //Console.WriteLine("Student: {0}", g.sID);

                    foreach (Students s in stud2)
                    {
                        if (s.sID == g.sID)
                        {
                            Console.WriteLine("{0} {1} | Grade: {2}", s.sFirst, s.sLast, g.gGrade);
                        }
                    }
                }
            }   
        }
    }

    Console.WriteLine("");
}

另外,我想删除重复的类。假设第一年,也就是 2015 年,有 2 名学生选修同一门课程。因此,在输出中,它两次说明该课程,并且在每门课程下都是两个学生。

我得到的输出: 我得到的输出:

标签: c#

解决方案


您没有显示您的数据类,但几乎可以肯定的是,您错过了年级到年级的连接条件(即年级是年级、课程和学生之间相交的“事实”字段值)。

如果没有这个额外的连接条件,您将在课程举办的每一年“重复”学生成绩的笛卡尔积,唯一的限制是学生必须至少完成一次该课程,这就是您看到的原因每年重复相同课程的相同学生。

你的Grades班级应该是这样的:

class Grades
{
  public string gCourse {get; set; }
  public int sId {get; set; }
  public int gGrade {get; set; }
  public int gYear {get; set; } // <<< Use this
}

您可以通过添加额外的连接条件来解决不需要的重复,如下所示:

// ... Outer loops
foreach (Grades g in grade2)
{
    if (g.gCourse == c.gCourse && g.gYear == y.gYear) // << Additional Join condition
    {
        foreach (Students s in stud2)
        {
            if (s.sId == g.sId)
            {
                Console.WriteLine("{0} {1} | Grade: {2}", s.sFirst, s.sLast, g.gGrade);
            }
        }
    }
}   

推荐阅读