在我更新 student.Id 后,它拒绝添加到我的哈希表中

After I update my student.Id it refuses to be added to my Hashtable

在哈希表的课程中,在线老师轻描淡写地建议尝试更新“学生 ID”,在 foreach 循环中表示为 student.Id,具体取决于两个 ID 相同的实例。

我尝试创建 foreach 循环,使用方法 ContainsKey() 检查,然后执行更新或将 student.Id 添加到哈希表。我发现的问题是 student.Id 得到更新,例如ID 2 变为 3,因为 2 已被添加到列表中,但此后拒绝将其添加到此列表中。

我想我忽略了一些明显的东西?


static void Main(string[] args)
{

            Hashtable studentsTable = new Hashtable();

            Student[] students = new Student[5];
            students[0] = new Student(1, "Maria", 98);
            students[1] = new Student(2, "Bob", 62);
            students[2] = new Student(1, "Mary", 90);
            students[3] = new Student(4, "Eric", 88);
            students[4] = new Student(5, "Clint", 72);


            foreach(Student student in students)
            {
                
                if(!studentsTable.ContainsKey(student.Id))
                {
                    studentsTable.Add(student.Id, student);
                    Console.WriteLine("Student with Id{0} was added!.", student.Id);
                }
                else if (studentsTable.ContainsKey(student.Id))
                {
                    do
                    {

                    student.Id += 1;

                    // this write line was to check that the id was being updated   

                    Console.WriteLine(student.Id);

                    } while (studentsTable.ContainsKey(student.Id));

                    // same as above comment

                    Console.WriteLine(student.Id);

                    studentsTable.Add(student.Id, student);
                }
                else
                 {
                 Console.WriteLine("Sorry, A student with the same ID: {0}, already Exists.", student.Id);
                 }


            }


        }

        class Student
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public float GPA { get; set; }

            public Student(int id, string name, float GPA)
            {
                this.Id = id;
                this.Name = name;
                this.GPA = GPA;
            }

        }

我们可以将您的逻辑简化为:

    foreach(Student student in students)
    {
        
        while(studentsTable.ContainsKey(student.Id)){
          student.Id++;
        }

        studentsTable.Add(student.Id, student);
        Console.WriteLine("Student with Id{0} was added!.", student.Id);
        
    }

但我认为它没有问题。散列 table ID 必须是唯一的,因此当 table 中已经有一名学生与我们要添加的学生具有相同的 ID 时,我们增加我们要添加的学生的 ID 和再次检查,直到我们找到不在 table 中的 ID。在实践中,这意味着 ID 为 1 的第二个学生将在添加之前将 ID 变为 3。如果你在 foreach 的末尾打印 table 会看到 1,2,3,4,5(好吧,hashtables 没有排序所以你可能会看到任何顺序,但是你' d 看到 5 个唯一 ID,Mary 将是 3)

顺便说一下,对于学习引用类型来说,这是一个有趣的点,无论您打印列表还是散列 table,您都会看到 Mary 在每个列表中都将其 ID 更新为 3。这是因为内存中永远只有一个 Mary,所以更新内存数据本身意味着所有引用 Mary 的东西(列表、散列 table、任何临时循环变量)都经历更新因为这是对一个数据块的多个引用,就像对一个原始文件的多个快捷方式

请注意,您的 else 逻辑极不可能被使用,因此我将其删除