2012-03-10 2 views
0

Возможно, это может быть быстро «не может быть сделано», однако я искал и не могу найти ответ на свой конкретный запрос.Использование переменной для инициализации объекта

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

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(); 

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

ответ

6

Это было бы возможно с extension method на тип строки, но это, конечно, не рекомендуется. Почему бы не использовать 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

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

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)), чем поиск по списку (О (п)), что делает FirstOrDefault.

0

Создайте класс и выведите его из 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; 
    } 
} 
Смежные вопросы