C#对象列表并引用列表中的对象

C#对象列表并引用列表中的对象,c#,list,object,C#,List,Object,我有一个关于列表中某个对象的引用的问题 我有一个学生班级如下 private void Form_Load(object sender, EventArgs e) { List<Students> ListOfStudents = new List<Students>(); ListOfStudents.Add(new Students("Alex", 1)); ListOfStudents.Add(new

我有一个关于列表中某个对象的引用的问题

我有一个学生班级如下

    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);
        }
    }
private void Form\u加载(对象发送方,事件参数e)
{
ListOfStudents=新列表();
添加(新生(“Alex”,1));
添加(新生(“Bob”,2));
新增(新生(“凯瑟琳”,3));
添加(新生(“Dave”,4));
新增(新生(“Eric”,5));
新增(新生(“弗兰克”,6));
foreach(学生名单中的var学生)
{
学生s=新生(student.StudentName,student.StudentID);
s、 Dosomework();
}
}
公立班学生
{
公共字符串StudentName{get;set;}
公共int StudentID{get;set;}
公立学生()
{ }
公立学生(string\u studentname,int\u studentid)
{
StudentName=\u StudentName;
StudentID=_StudentID;
}
Timer timerDoSomethingEveryTsec=新计时器();
公共工程
{
初始时间混响秒(5000);
}
公共停车场()
{
TimerDosMethingEverytsec.Stop();
}
/// 
///这是x时间后操作的计时器
/// 
公共void inittimerevireytsec(int t)
{
timerDoSomethingEveryTsec.Tick+=新事件处理程序(timer1\u tickerytsec);
TimerDosMethingEverytsec.Interval=t;//以毫秒为单位
TimerDosMethingEverytsec.Start();
}
私有void timer1\u TickEveryTsec(对象发送方,事件参数e)
{
Show(StudentName+“正在使用ID”+StudentID);
}
}
还有一份学生名单

现在,如果当我加载表格时,学生们会在每个滴答声中“做作业”。 我的问题是:

如何访问非常具体的实例化“Students s”,其中s=Eric,ID=5

我想访问学生“ERIC with#5”到s.Stop()。有没有办法做到这一点?
谢谢。

好吧,因为您列表中的
学生
的实例都没有实际运行
Dosomework
方法,所以要阻止Eric将非常困难

var MyStudent = ListOfStudents.Where(x=> x.ID == 5).FirstOrDefault();
原因是,您没有为列表中的实例调用
Dosomework
方法,而是创建具有相同属性的新实例,并对这些实例调用
Dosomework
方法。这意味着当您的
foreach
循环结束时,
s
将指向名为
Frank
和id
6
Students
类的一个新实例,并且您没有对实际正在做一些工作的
Eric
实例的引用

因此,要更改的第一件事是
foreach
循环中的代码-不要创建新实例,只需对列表中存储的实例执行
Dosomework
方法即可:

    foreach (var student in ListOfStudents)
    {
        student.Dosomework();
    }
然后您可以使用该方法查找id=5的学生:

var eric = ListOfStudents.Find(s => s.Id == 5);
现在您已经获得了正确的实例,只需执行
StopWork
方法:

eric.StopWork();
另外,我建议您在所有方法中都坚持使用Pascal大小写(这样
Dosomework
就变成
Dosomework

假设您有

List<Students> listOfStudents = new List<Students>();

顺便说一句,我真的建议将您的类称为“学生”,因为每个实例都代表一个学生。这也允许列表变量是“学生”,因为它代表一个或多个学生。

你应该考虑对你的代码做些解释。构造函数不需要任何参数。无需使用
.Where
.FirstOrDefault
。这两项都意味着有多个学生的名字是Eric,Id是5。可能有许多学生同名,但Id使他们独一无二<代码>学生列表.Single(x=>x.StudentID==5)好提示。经常自学(回答问题)谢谢,var eric=ListOfStudents.Find(s=>s.Id==5);他给我指出了正确的观点。
var eric = listOfStudents.Where(x => x.StudentName=="Eric" && x.StudentID==5).FirstOfDefault(null);