使用变量初始化对象
本文关键字:对象 初始化 变量 | 更新日期: 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;
}
}