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
和id6
的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);