Adam Ответов: 2

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 для тех, кто поможет мне сегодня.
Я здесь не за подачками.

2 Ответов

Рейтинг:
2

Patrice T

Цитата:
Я *думаю*, что проблема в том, что переменная numberofStudents получает неправильное значение.

Не думайте, используйте отладчик, чтобы убедиться!

Ваш код ведет себя не так, как вы ожидаете, и вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что вы должны делать, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Обратная сторона этого решения:
- Это DIY, вы один отслеживаете проблему и находите ее корни, которые ведут к решению.
Положительная сторона этого решения:
- Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.

Вторичное воздействие
- Вы будете гордиться тем, что сами находите Жуков.
- Ваши навыки обучения улучшатся.

Вы должны довольно быстро найти, что не так.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладка кода C# в Visual Studio - YouTube[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


Рейтинг:
2

Gerry Schmitz

// iterating through looking for student id to remove.
for ( int z = 0; z < numberofStudents; z++ ) {
   if ( courses[ i ].studentsInCourse[ z ] == studentID ) {

      // courses.Remove( courses[ i ].studentsInCourse[ z ] );

      courses[ i ].studentsInCourse.Remove( studentID );
      break;
   }
}