C#, неверное значение, заданное после удаления элемента из списка
/*
Вся программа работает корректно, за исключением последней функции: removeStudent.
Когда я удаляю студента из определенного курса, нет никаких проблем - до тех пор, пока я не хочу распечатать список студентов, в настоящее время зачисленных на курс, из которого этот студент был удален. Я *думаю*, что проблема в том, что переменная numberofStudents получает неправильное значение. Я понятия не имею, почему это происходит. Причина, по которой я храню только студенческий билет в каждом курсе, а не весь объект student, заключается в том, что имена студентов могут быть изменены, и нет смысла дублировать данные и требовать их обновления дважды.
Проблема заключается в следующем: добавление студента, добавление курса, удаление студента, печать студентов в классе, в который этот студент был ранее зачислен.
Ниже приведен мой код. Всего три класса. Ничего плохого ни в студенте, ни в Главном.
*/
использование системы;
использование системы.Коллекции.Общий;
использование System.Linq;
использование System.Text;
пространство имен ConsoleApp1
{
конечно, открытый класс
{
public string courseName { get; set; }
public string teacherFirst { get; set; }
public string teacherLast { get; set; }
// используется в качестве первичного ключа для курса.
public static int courseCount = 0;
// используется для хранения каждого курса.
публичный статический словарь и Л;int, конечно&ГТ; курсы = новый словарь и Л;int, конечно&ГТ;();
// используется для хранения идентификатора каждого студента в курсе.
Список
<int>
studentsInCourse = новый список
<int>
();
// конструктор для создания объекта курса.
публичный курс(имя строки, строка первая, строка последняя, список
<int>
newStudentList)
{
courseName = имя;
teacherFirst = первый;
teacherLast = последний;
studentsInCourse = newStudentList;
}
// метод, который создает курс.
public static void addCourse()
{
courseCount++;
Приставка.Write("\nPlease enter the name of the course: "); // захват ввода от пользователя.
имя строки = консоль.Линия чтения();
Приставка.Напишите("пожалуйста, введите имя учителя: "); // захват ввода от пользователя.
строка первая = консоль.Линия чтения();
Приставка.Напишите("пожалуйста, введите фамилию учителя: "); // захват ввода от пользователя.
последние строки = консоли.Линия чтения();
Список
<int>
studentsInCourse = новый список
<int>
();
Курс добавлен = новый курс(название, имя, фамилия, studentsInCourse);
courses.Add(courseCount, добавлено);
}
// печатает список всех доступных в настоящее время курсов.
общественная статический недействительным printCourse()
{
foreach (KeyValuePair<int, Course> pair in courses)
{
Приставка.WriteLine("\nCourse ID: {0}", pair.Key);
Приставка.WriteLine("имя курса: {0}", pair.Value.courseName);
Приставка.WriteLine("имя учителя: {0} {1}", pair.Value.teacherFirst, пара.Значение.teacherLast);
}
}
// добавление студента к определенному курсу.
public static void addStudentToCourse()
{
Приставка.Напишите("пожалуйста, введите студенческий билет: ");
строка studentInput = консоль.Линия чтения();
int studentID = конвертировать.ToInt32(studentInput);
Приставка.Напишите("пожалуйста, введите идентификатор курса: ");
строка courseInput = консоль.Линия чтения();
int courseID = конвертировать.ToInt32(courseInput);
курсы[courseID].studentsInCourse.Добавить(studentID);
}
// печать всех студентов, назначенных на определенный курс.
public static void printStudentsInCourse()
{
Приставка.Напишите("пожалуйста, введите идентификатор курса: ");
строка courseInput = консоль.Линия чтения();
int courseID = конвертировать.ToInt32(courseInput);
int numberofStudents = courses[courseID].studentsInCourse.Рассчитывать();
Приставка.Метода WriteLine("\nCourse идентификатор: {0}", курсы[идентификатор_курса].courseName);
Приставка.WriteLine("\n количество студентов, обучающихся в настоящее время на этом курсе: {0}\n", numberofStudents);
for (int i = 0; i < numberofStudents; i++)
{
строка x = courses[courseID].studentsInCourse[i].Метод toString();
int addID = конвертировать.ToInt32(x);
Приставка.Метода WriteLine("Студенческая идентификатор: {0} \nFull имя: {1} {2}\н" х, студентом.ток[addID].Имя, Студент.ток[addID].Фамилия);
}
}
public static void removeStudent(int studentID)
{
// захват количества курсов, заполненных в данный момент.
int numberofCourses = курсы.Рассчитывать;
// проходя каждый курс, удаляя студента, если это необходимо.
for (int i = 1; i < numberofCourses; i++)
{
// захват количества студентов на конкретном курсе.
int numberofStudents = курсы[i].studentsInCourse.Рассчитывать();
// итерация через поиск студенческого билета для удаления.
for (int z = 0; z < numberofStudents; z++)
{
if(courses[i].studentsInCourse[z] == studentID)
{
курсы.Удалить(курсы[i].studentsInCourse[z]);
}
}
}
}
}
}
использование системы;
использование системы.Коллекции.Общий;
использование System.Text;
пространство имен ConsoleApp1
{
ученик открытый класс
{
общественного строка имя { получить; набор; }
общественного строка имя { получить; набор; }
// используется в качестве первичного ключа для студента.
public static int student_ID = 0;
публичный студент(строка первая, строка последняя)
{
Имя = первый;
Фамилия = последний;
}
публичный статический словарь<int, Student> current = новый словарь<int, Student>
();
// используется для печати всех студентов в системе.
общественная статический недействительным printStudents()
{
если (ток.Количество == 0)
{
Приставка.WriteLine("в настоящее время нет студентов, которые были бы
добавлено в сервис.");
}
еще
{
foreach (KeyValuePair<int, Student> pair in current)
{
Приставка.WriteLine("\nStudent ID: {0}", pair.Key);
Приставка.WriteLine("First Name: {0}", pair.Value.имя);
Приставка.WriteLine("фамилия: {0}", pair.Value.фамилия);
}
}
}
// используется для проверки наличия студента с идентификатором студента, введенным пользователем.
public static bool findStudentID(int studentID)
{
bool value = false;
если (ток.ContainsKey(studentID))
{
Приставка.WriteLine("\nA студент был найден с этим идентификационным номером.\n");
значение = true;
}
еще
{
Приставка.Метода WriteLine("\студент на был *не* нашли с таким номером.");
Приставка.WriteLine("никаких правок сделано не будет.");
}
значение;
}
// используется для редактирования имени конкретного студента.
public static void editFirstName(int studentID, string newFirstName)
{
foreach (KeyValuePair<int, Student> pair in current)
{
если (пара.Ключ == studentID)
{
пара.значение.Имя = newFirstName;
}
}
}
// используется для редактирования фамилии конкретного студента.
public static void editLastName(int studentID, string newLastName)
{
foreach (KeyValuePair<int, Student> pair in current)
{
если (пара.Ключ == studentID)
{
пара.значение.Фамилия = newLastName;
}
}
}
// удалить студента из словаря студентов.
public static void removeStudent(int studentID)
{
current.Remove(studentID);
}
}
}
использование системы;
пространство имен ConsoleApp1
{
классная программа
{
static void Main(string[] args)
{
строковый ввод = null;
while (input != "10")
{
printMenu();
вход = консоль.Линия чтения();
переключатель (вход)
{
// добавить нового ученика.
дело "1":
{
addStudent();
перерыв;
}
// распечатайте все имена студентов.
дело "2":
{
Студент.printStudents();
перерыв;
}
// Изменить имя студента.
дело "3":
{
Приставка.Напишите("пожалуйста, введите студенческий билет: ");
иначе, если один операнд строкового = консоли.Линия чтения();
int studentID = конвертировать.ToInt32(userInput);
bool value = Student.findStudentID(studentID);
if (value == true)
{
Приставка.Напишите("пожалуйста, введите новое имя: ");
строка newFirstName = консоль.Линия чтения();
Student.editFirstName(studentID, newFirstName);
}
перерыв;
}
// Изменить фамилию студента.
дело "4":
{
Приставка.Напишите("пожалуйста, введите студенческий билет: ");
иначе, если один операнд строкового = консоли.Линия чтения();
int studentID = конвертировать.ToInt32(userInput);
bool value = Student.findStudentID(studentID);
if (value == true)
{
Приставка.Напишите("пожалуйста, введите новую фамилию: ");
строка newLastName = консоль.Линия чтения();
Student.editLastName(studentID, newLastName);
}
перерыв;
}
// удалить студента из списка и всех курсов, на которых он находится
назначено.
дело "5":
{
Приставка.Напишите("пожалуйста, введите студенческий билет: ");
иначе, если один операнд строкового = консоли.Линия чтения();
int studentID = конвертировать.ToInt32(userInput);
Student.removeStudent(studentID);
Курс.removeStudent(studentID);
перерыв;
}
// добавить курс.
дело "6":
{
Конечно.addCourse();
перерыв;
}
// список всех доступных текущих курсов.
дело "7":
{
Конечно.printCourse();
перерыв;
}
// добавить студента в курс.
дело "8":
{
Конечно.addStudentToCourse();
перерыв;
}
// распечатайте всех студентов в определенном курсе.
дело "9":
{
Конечно.printStudentsInCourse();
перерыв;
}
// выйдите из программы.
дело "10":
{
Приставка.WriteLine("закрытие программы.");
Приставка.ReadKey();
перерыв;
}
// был введен ввод, который не был действителен для меню.
по умолчанию:
{
Приставка.WriteLine("*введенные данные были недопустимы.*");
//printMenu();
перерыв;
}
}
}
}
// список всех опций, доступных в программе.
public static void printMenu()
{
Приставка.WriteLine("\nMenu");
Приставка.WriteLine("чтобы добавить студента, введите 1.");
Приставка.WriteLine("чтобы получить список всех студентов, введите 2.");
Приставка.WriteLine("изменить имя студента введите 3.");
Приставка.WriteLine("изменить фамилию студента введите 4.");
Приставка.WriteLine("чтобы удалить студента, введите 5.");
Приставка.WriteLine("чтобы добавить курс, введите 6.");
Приставка.WriteLine("чтобы получить список всех текущих курсов, введите
7.");
Приставка.WriteLine("чтобы добавить студента в курс, введите 8.");
Приставка.WriteLine("чтобы получить список всех студентов курса, введите
9.");
Приставка.WriteLine("чтобы выйти из программы введите 10.\n");
Приставка.Напишите("пожалуйста, введите выбор: ");
}
public static void addStudent()
{
Student.student_ID++;
Приставка.Write("\nPlease enter student's first name: "); // захват
ввод от пользователя.
строка имя = консоли.Линия чтения();
Приставка.Напишите("пожалуйста, введите фамилию студента: "); // захват
ввод от пользователя.
строка фамилия = консоль.Линия чтения();
Студент добавлен = новый студент(имя, фамилия);
Student.current.Add(Student.student_ID, добавлено);
}
}
}
Что я уже пробовал:
Я пытался выяснить, почему переменная numberofStudents дает неправильное значение для конкретного класса после того, как студент был удален, но безуспешно.
Я предложил бесплатный кофе тому, кто помог мне вчера.
Однако Джерри Шмитц не захотел принять мое предложение.
10-долларовая подарочная карта starbucks для тех, кто поможет мне сегодня.
Я здесь не за подачками.