2016-01-10 15 views
1

Я создал приложение, в котором вы можете добавить учеников и преподавателей в список каждого, и мне нужно выполнить поиск в списках, чтобы найти студента или лектора по имени или идентификатору. Однако, когда я перебираю список, чтобы найти подходящую строку, он найдет соответствующую строку и распечатает детали, но оператор else, говорящий, что учащийся не найден, запускается для каждого другого члена списка. Я попытался сделать перерыв после утверждения if, но это все еще происходит. Как это исправить?Как перебирать список объектов и искать строку в C#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace DBSManagement 
{ 
    class College: Staff 
    { 
     public static List<Student> students = new List<Student>(); 
     public static List<Lecturer> lecturers = new List<Lecturer>(); 

     static void Main() 
     { 
      int choice; 
      bool seeAgain = true; 

       do 
       { 
        Console.WriteLine("Press"); 
        Console.WriteLine("1: To add a student"); 
        Console.WriteLine("2: To add a lecturer"); 
        Console.WriteLine("3: To search for a lecturer or student"); 
        Console.WriteLine("4: To show the details of all enrolled students"); 
        Console.WriteLine("5: To show the names of all lecturers"); 
        Console.WriteLine("6: To show payroll details for a lecturer"); 
        Console.WriteLine("7: To quit"); 
        int.TryParse(Console.ReadLine(), out choice); 

        switch (choice) 
        { 
         case 1: 
          AddStudent(); 
          break; 
         case 2: 
          AddLecturer(); 
          break; 
         case 3: 
          SearchPerson(); 
          break; 
         case 4: 
          ShowStudents(); 
          break; 
         case 5: 
          ShowLecturers(); 
          break; 
         case 6: 
          ShowPayrollDetails(); 
          break; 
         case 7: 
          seeAgain = false; 
          break; 
         default: 
          Console.WriteLine("Invalid option selected"); 
          break; 
        } 
       } while (seeAgain); 
      } 
     public static void AddStudent() 
     { 
      Student student = new Student(); 
      Console.WriteLine("Enter student name:"); 
      student.Name = Console.ReadLine(); 
      Console.WriteLine("Enter student address:"); 
      student.Address = Console.ReadLine(); 
      Console.WriteLine("Enter student phone number:"); 
      student.Phone = Console.ReadLine(); 
      Console.WriteLine("Enter student email:"); 
      student.Email = Console.ReadLine(); 
      Console.WriteLine("Enter student PPSN:"); 
      student.PPSN = Console.ReadLine(); 
      Console.WriteLine("Enter student status (postgrad or undergrad):"); 
      EnterStat: 
       string stat = Console.ReadLine().ToLower(); 
       if (stat == "postgrad" || stat == "undergrad") 
       { 
        student.Status = (Status)Enum.Parse(typeof(Status), stat); 
       } 
       else 
       { 
        Console.WriteLine("Please enter either postgrad or undergrad:"); 
       goto EnterStat; 
       } 
      Console.WriteLine("Enter student ID:"); 
      int inStudentID; 
      int.TryParse(Console.ReadLine(), out inStudentID); 
      student.StudentID = inStudentID; 
      students.Add(student); 
     } 

     public static void AddLecturer() 
     { 
      Lecturer lecturer = new Lecturer(); 
      Console.WriteLine("Enter lecturer name:"); 
      lecturer.Name = Console.ReadLine(); 
      Console.WriteLine("Enter lecturer address:"); 
      lecturer.Address = Console.ReadLine(); 
      Console.WriteLine("Enter lecturer phone number:"); 
      lecturer.Phone = Console.ReadLine(); 
      Console.WriteLine("Enter lecturer email:"); 
      lecturer.Email = Console.ReadLine(); 
      Console.WriteLine("Enter lecturer PPSN:"); 
      lecturer.PPSN = Console.ReadLine(); 
      Console.WriteLine("Enter lecturer ID:"); 
      lecturer.ID = Console.ReadLine(); 
      Console.WriteLine("Enter salary:"); 
      lecturer.Salary = decimal.Parse(Console.ReadLine()); 
      Console.WriteLine("Enter subject taught:"); 
      lecturer.SubjectTaught = Console.ReadLine().ToLower(); 
      lecturers.Add(lecturer); 
     } 

     public static void SearchPerson() 
     { 
      int searchChoice = 0; 
      int studentSearch = 0; 
      int lecturerSearch = 0; 
      Console.WriteLine("Press:"); 
      Console.WriteLine("1 to search for a student"); 
      Console.WriteLine("2 to search for a lecturer"); 
      int.TryParse(Console.ReadLine(), out searchChoice); 

      switch (searchChoice) 
      { 
       //search students 
       case 1: 
        Console.WriteLine("Press:"); 
        Console.WriteLine("1 to search by name"); 
        Console.WriteLine("2 to search by student number"); 
        int.TryParse(Console.ReadLine(), out studentSearch); 

        switch (studentSearch) 
        { 
         case 1: 
          Console.WriteLine("Enter student name:"); 
          string studentNameSearch = Console.ReadLine(); 

          foreach (Student student in students) 
           //(int i = 0; i < students.Count; i++) 
          { 
           if (student.Name.Contains(studentNameSearch)) 
           { 
            Console.WriteLine(student.ToString()); 
            break; 
           } 
           else 
           { 
            Console.WriteLine("Student name not found"); 
           } 
          } 
          break; 

         case 2: 
          int studentIDSearch; 
          Console.WriteLine("Enter student number:"); 
          int.TryParse(Console.ReadLine(), out studentIDSearch); 

          for (int i = 0; i < students.Count; i++) 
          { 
           if (students[i].StudentID == studentIDSearch) 
           { 
            Console.WriteLine(students[i].ToString()); 
           } 
           else 
           { 
            Console.WriteLine("Student number not found"); 
           } 
          } 
          break; 

         default: 
          Console.WriteLine("Invalid option selected"); 
          break; 
        } 
        break; 
       //search lecturers 
       case 2: 
        Console.WriteLine("Press:"); 
        Console.WriteLine("1 to search by name"); 
        Console.WriteLine("2 to search by course taught"); 
        int.TryParse(Console.ReadLine(), out lecturerSearch); 

        switch (lecturerSearch) 
        { 
         case 1: 
          Console.WriteLine("Enter lecturer name:"); 
          string lecturerNameSearch = Console.ReadLine(); 
          for (int i = 0; i < lecturers.Count; i++) 
          { 
           if (lecturers[i].Name == lecturerNameSearch) 
           { 
            Console.WriteLine(lecturers[i].ToString()); 
           } 
           else 
           { 
            Console.WriteLine("Lecturer name not found"); 
           } 
          } 
          break; 

         case 2: 
          Console.WriteLine("Enter course taught:"); 
          string lecturerSubjectSearch = Console.ReadLine().ToLower(); 
          for (int i = 0; i < lecturers.Count; i++) 
          { 
           if (lecturers[i].SubjectTaught == lecturerSubjectSearch) 
           { 
            Console.WriteLine(lecturers[i].ToString()); 
           } 
           else 
           { 
            Console.WriteLine("Subject not found"); 
           } 
          } 
          break; 
         default: 
          Console.WriteLine("Invalid option selected"); 
          break; 
        } 
        break; 

       default: 
        Console.WriteLine("Invalid option selected"); 
        break; 
      } 
     } 

     public static void ShowStudents() 
     { 
      //sort list by name 
      List<Student> SortedStudents = students.OrderBy(o => o.Name).ToList(); 

      foreach (Student student in SortedStudents) 
      { 
       Console.WriteLine(student); 
      } 
     } 

     public static void ShowLecturers() 
     { 
      //sort list by name 
      List<Lecturer> SortedLecturers = lecturers.OrderBy(o => o.Name).ToList(); 

      foreach (Lecturer lecturer in SortedLecturers) 
      { 
       Console.WriteLine(lecturer.Name); 
      } 
     } 

     public static void ShowPayrollDetails() 
     { 
      Console.WriteLine("Enter lecturer name:"); 
      string lecturerNameSearch = Console.ReadLine(); 
      for (int i = 0; i < lecturers.Count; i++) 
      { 
       if (lecturers[i].Name == lecturerNameSearch) 
       { 
        Console.WriteLine(lecturers[i].PayrollDetails()); 
       } 
       else 
       { 
        Console.WriteLine("Lecturer name not found"); 
       } 
      } 
     } 
    } 
} 
+0

Yikes, сэкономить много ненужной строки кода и использовать LINQ. – Wobbles

+0

static List matchingStudents = students.Where (s => s.Name = searchVal) .toList(); – Wobbles

+0

Я не знаю, что такое Linq, я в колледже, и они не упомянули об этом. Я посмотрю! –

ответ

2

Попробуйте это

  Boolean found = false; 
      foreach (Student student in students) 
      //(int i = 0; i < students.Count; i++) 
      { 
       if (student.Name.Contains(studentNameSearch)) 
       { 
        Console.WriteLine(student.ToString()); 
        found = true; 
        break; 
       } 
      } 
      if(found == false) 
      { 
        Console.WriteLine("Student name not found"); 
      }​ 
+0

Я пробовал это, но он утверждает, что найденный определяется, но никогда не используется. –

+0

Предупреждение не имеет никакого смысла. Вы скопировали код правильно? – jdweng

+0

Я не думал, что это имеет смысл. Правда, я правильно копировал. Я попробовал еще раз, и это дает мне неожиданную ошибку персонажа для закрывающей скобки второго оператора if. Делает еще меньше смысла. –

1

Ваш код выхода "название Student не найден" для каждого элемента student в списке, который

  • не удовлетворяет условию student.Name.Contains(studentNameSearch) и
  • предшествует первый элемент в списке, который удовлетворяет условию (если такой элемент существует, в противном случае сообщение является pri для каждого элемента в списке).

Вы можете быть уверены, что не существует ни один студент, удовлетворяющий условию после рылась всего списка только.

Возможное решение:

Student studentMatch = null; 
foreach (Student student in students) 
{ 
    if (student.Name.Contains(studentNameSearch)) 
    { 
     studentMatch = student; 
     break; 
    } 
}  
if (studentMatch == null) 
{ 
    Console.WriteLine("Student name not found"); 
} 
else 
{ 
    Console.WriteLine(studentMatch.ToString()); 
}