在我更新 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
逻辑极不可能被使用,因此我将其删除
在哈希表的课程中,在线老师轻描淡写地建议尝试更新“学生 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
逻辑极不可能被使用,因此我将其删除