使用变量初始化对象

本文关键字:对象 初始化 变量 | 更新日期: 2023-09-27 18:27:32

这可能会很快成为"无法完成",但我已经四处寻找,找不到特定查询的答案。

我的问题是,我有一个用于保存学生详细信息的结构,现在假设我有两个学生,一个叫Mike,另一个叫Dave,我想在屏幕上获得每个学生的详细信息。我的结构中有一个这样的方法:

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

为了显示正确的学生,这可行吗?

使用变量初始化对象

使用字符串类型的扩展方法是可行的,但肯定不推荐使用。为什么不使用LINQ在一组学生中查找具有给定姓氏的学生呢?

List<Student> students 
   = new List<Student>
      { 
         new Student { Surname = "Smith" }, 
         new Student { Surname = "Jones" } 
      };
Student studentJones = students.FirstOrDefault(s => s.Surname == "Jones");

其他注意事项:

  • 除非有充分的理由,否则请使用类,而不是结构
  • 对方法和类型名称使用PascalCase
  • 避免使用公共字段,而是使用属性

您可以将它们放入字典中。

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

顺便说一句,从字典中检索通常比查找列表(O(n))更快(O(1)),FirstOrDefault就是这样做的。

创建一个类并从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;
    }
}