我有一个关于列表中对象引用的问题。
我有一个学生班级如下
private void Form_Load(object sender, EventArgs e)
{
List<Students> ListOfStudents = new List<Students>();
ListOfStudents.Add(new Students("Alex", 1));
ListOfStudents.Add(new Students("Bob", 2));
ListOfStudents.Add(new Students("Cathrine", 3));
ListOfStudents.Add(new Students("Dave", 4));
ListOfStudents.Add(new Students("Eric", 5));
ListOfStudents.Add(new Students("Frank", 6));
foreach (var student in ListOfStudents)
{
Students s = new Students(student.StudentName, student.StudentID);
s.Dosomework();
}
}
public class Students
{
public string StudentName { get; set; }
public int StudentID { get; set; }
public Students()
{ }
public Students(string _studentname, int _studentid)
{
StudentName = _studentname;
StudentID = _studentid;
}
Timer timerDoSomethingEveryTsec = new Timer();
public void Dosomework()
{
InitTimerEveryTsec(5000);
}
public void StopWork()
{
timerDoSomethingEveryTsec.Stop();
}
/// <summary>
/// This is the timer for the action after x time
/// </summary>
public void InitTimerEveryTsec(int t)
{
timerDoSomethingEveryTsec.Tick += new EventHandler(timer1_TickEveryTsec);
timerDoSomethingEveryTsec.Interval = t; // in miliseconds
timerDoSomethingEveryTsec.Start();
}
private void timer1_TickEveryTsec(object sender, EventArgs e)
{
MessageBox.Show(StudentName + " is working with ID " + StudentID);
}
}
和ListOfStudents。
现在,如果我加载表单时,学生班级将“Dosomework”每次打勾。 我的问题是:
如何访问特定实例化的“学生s”,其中s = Eric,ID = 5。
我想访问学生“ERIC with#5”到s.Stop()。有没有实现这一目标? 谢谢。
答案 0 :(得分:1)
好吧,由于列表中Students
的所有实例都没有实际运行Dosomework
方法,因此很难阻止Eric。
原因是,不是为列表中的实例调用Dosomework
方法,而是您正在创建具有相同属性的新实例并调用Dosomework
这些实例的方法。这意味着,当您的foreach
循环结束时,s
将指向Students
类的新实例,其名称为Frank
,标识为6
,并且您没有参考实际正在做某些工作的Eric
实例。
所以要改变的第一件事是foreach
循环中的代码 - 您应该只对列表中存储的实例执行Dosomework
方法,而不是创建新实例:
foreach (var student in ListOfStudents)
{
student.Dosomework();
}
然后,您可以使用Find
方法查找id = 5的学生:
var eric = ListOfStudents.Find(s => s.Id == 5);
现在您已经拥有了正确的实例,您只需要执行StopWork
方法:
eric.StopWork();
此外,我建议坚持使用c# naming conventions - 使用Pascal大小写来处理所有方法(因此Dosomework
变为DoSomeWork
)
答案 1 :(得分:0)
var MyStudent = ListOfStudents.Where(x=> x.ID == 5).FirstOrDefault();
答案 2 :(得分:0)
假设你有......
List<Students> listOfStudents = new List<Students>();
然后你可以找到一个学生......
var eric = listOfStudents.Where(x => x.StudentName=="Eric" && x.StudentID==5).FirstOfDefault(null);
顺便说一句,我真的建议打电话给你的班级&#34;学生&#34;因为每个实例代表一个学生。这也允许列表变量是&#34;学生&#34;因为它代表一个或多个学生。