使用对象时出现问题

时间:2014-06-14 11:42:48

标签: c#

我有一个程序如下:

 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次。 我知道如何解决它,但不知道这种实现方式的问题。有人可以帮忙。

由于

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变量存储实际对象的引用。

在上面的代码中,您将分配同一对象的属性值,然后在列表中添加三次相同对象的引用。