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

时间:2017-12-21 18:48:22

标签: 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 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()。有没有实现这一目标? 谢谢。

3 个答案:

答案 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;因为它代表一个或多个学生。