Использование переменной для инициализации объекта - PullRequest
0 голосов
/ 10 марта 2012

Это может закончиться быстрым «не может быть сделано», однако я искал и не могу найти ответ на мой конкретный запрос.

Моя проблема в том, что у меня есть структура для хранения сведений об учениках, теперь, скажем, у меня есть два ученика, одного по имени Майк, другого по имени Дейв, и я хочу получить подробную информацию о каждом из них на экране. У меня есть метод в моей структуре, подобный так :

public struct student{
   public String name, course;
   public int year, studentno;

   public void displayDetails(){
        Console.WriteLine("Name: "+name);
        Console.WriteLine("Course: "+course);
        Console.WriteLine("Student Number: "+studentno);
        Console.WriteLine("Year of Study: "+year);
        Console.WriteLine("\n\nPress any key to Continue....");
        Console.ReadKey();
    }
}

Теперь для отображения деталей я могу использовать любой из них, скажем, Mike.displayDetails (); или Dave.displayDetails ();

Есть ли способ, которым я могу попросить пользователя ввести имя и затем использовать это имя, чтобы получить правильного ученика? Например, я хочу использовать:

Console.Write("Please enter students name: ");
String surname = Console.ReadLine();

а потом как-нибудь использовать:

surname.displayDetails();

для отображения правильного студента, это выполнимо?

Ответы [ 3 ]

6 голосов
/ 10 марта 2012

Было бы выполнимо с методом расширения для строкового типа, но это, конечно, не рекомендуетсяПочему бы не использовать LINQ, чтобы найти ученика с заданной фамилией в собрании учеников?

List<Student> students 
   = new List<Student>
      { 
         new Student { Surname = "Smith" }, 
         new Student { Surname = "Jones" } 
      };

Student studentJones = students.FirstOrDefault(s => s.Surname == "Jones");

Другие замечания:

  • Используйте класс, а не структуру, если выесть веская причина для этого
  • Используйте PascalCase для имен методов и типов
  • Избегайте использования открытых полей, используйте свойства вместо
3 голосов
/ 10 марта 2012

Вы можете поместить их в словарь.

Dictionary<string, Student> dict = new Dictionary<string, Student>();
dict.Add("Dave", Dave);
dict.Add("Mike", Mike);
string surname = Console.ReadLine();
dict[surname].DisplayDetails();

Кстати, поиск из словаря обычно быстрее (O (1)), чем просмотр списка (O (n)), что FirstOrDefault делает.

0 голосов
/ 10 марта 2012

Создайте класс и наследуйте от KeyedCollection. Установите ключ, чтобы быть именем студента. Поскольку каждый студент добавлен в коллекцию, вы можете просто позвонить:

Console.Write(myCollection[surname].DisplayDetails());



public class Students : KeyedCollection<string, Student>
{
    // The parameterless constructor of the base class creates a 
    // KeyedCollection with an internal dictionary. For this code 
    // example, no other constructors are exposed.
    //
    public Students () : base() {}

    // This is the only method that absolutely must be overridden,
    // because without it the KeyedCollection cannot extract the
    // keys from the items. The input parameter type is the 
    // second generic type argument, in this case OrderItem, and 
    // the return value type is the first generic type argument,
    // in this case string.
    //
    protected override string GetKeyForItem(Student item)
    {
        // In this example, the key is the student's name.
        return item.Name;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...