我有一个程序如下:
var toppers = new List<Student>();
var students = new List<Student>
{
new Student(){Name = "A", Marks = 90, Gender = 'M'},
new Student(){Name = "B", Marks = 80, Gender = 'M'},
new Student(){Name = "C", Marks = 70, Gender = 'M'},
new Student(){Name = "D", Marks = 60, Gender = 'F'},
new Student(){Name = "E", Marks = 100, Gender = 'F'},
};
var student = new Student();
foreach (var stdnt in students)
{
if (stdnt.Marks >= 75)
{
student.Marks = stdnt.Marks;
student.Name = stdnt.Name;
toppers.Add(student);
}
}
foreach (var stdnt in toppers)
{
Console.WriteLine(stdnt.Name + "\t" + stdnt.Marks);
}
Console.ReadKey();
我得到的输出 E 100 打印3次。 我知道如何解决它,但不知道这种实现方式的问题。有人可以帮忙。
由于
答案 0 :(得分:1)
您正在将错误的对象添加到toppers
列表中。这一行:
toppers.Add(student);
应该是:
toppers.Add(stdnt);
或者,如果您想要一个新的学生对象,请在循环中创建它:
student = new Student();
答案 1 :(得分:1)
问题在于您重用对象student
。不是每次都创建一个新的,而是每次都改变现有的唯一一个。
你应该在每个foreach中创建一个新学生:
foreach (var stdnt in students)
{
if (stdnt.Marks >= 75)
{
var student = new Student(); // create a new student here!
student.Marks = stdnt.Marks;
student.Name = stdnt.Name;
toppers.Add(student);
}
}
您可以轻松地重复使用列表中的现有项目:
foreach (var stdnt in students)
{
if (stdnt.Marks >= 75)
{
toppers.Add(stdnt);
}
}
甚至使用linq:
var toppers = students.Where(x => x.Marks > 75);
答案 2 :(得分:1)
在c#类对象中是引用类型。这意味着student变量存储实际对象的引用。
在上面的代码中,您将分配同一对象的属性值,然后在列表中添加三次相同对象的引用。