linq 在列表中添加新对象

r8uurelv  于 2023-09-28  发布在  其他
关注(0)|答案(5)|浏览(122)

我有一个学生名单。我想在列表中添加新的对象,但想使用列表的第一项,并更新一些一些字段,然后将其添加为列表中的新对象。但是当我这样做时,它只更新现有的列表,而不是作为新对象添加到列表中。下面是我的代码。这只是一个参考数据。我有50个模型领域,我需要使用现有的数据和更新一个值,然后需要添加到列表中的新对象。

static void Main(string[] args)
        {
           
            // Student collection
            IList<Student> studentList = new List<Student>() {
        new Student() { StudentName = "John", Section ="A",Age = 13} ,
        new Student() { StudentName = "Moin",Section ="A",  Age = 21 } ,
        new Student() { StudentName = "Bill",Section ="A",  Age = 18 } ,
        new Student() {StudentName = "Ram" ,Section ="A", Age = 20} ,
        new Student() {StudentName = "Ron" ,Section ="A", Age = 15 }
    };

            

            var addnewStudent= studentList[0];
            addnewStudent.Age = 30;
            studentList.Add(addnewStudent);
             Console.WriteLine(studentList);
        }
    }
c0vxltue

c0vxltue1#

我想在列表中添加新的对象,但要使用列表的第一个项目,并更新一些领域,然后将其作为新的对象添加到列表中
如果不使用new,你不能添加一个 new 对象,如果你更新一个现有的对象,你不会创建一个新的对象。因此,如果您真的想获取一个现有对象并修改一个属性,那么使用复制构造函数可能是一个好主意。下面是一个示例:

public class Student
{
    public string StudentName { get; set; }
    public string Section { get; set; }
    public int Age { get; set; }

    public Student(string studentName, string section, int age)
    {
        StudentName = studentName;
        Section = section;
        Age = age;
    }

    public Student(Student copyStudent) 
        : this(copyStudent.StudentName, copyStudent.Section, copyStudent.Age){}
}

这样做的好处是,你不需要复制所有的属性,你想从一个现有的学生创建新的学生,但类本身处理:

var addnewStudent = new Student(studentList[0]);
addnewStudent.Age = 30;
studentList.Add(addnewStudent);
krugob8w

krugob8w2#

这一行:

var addnewStudent= studentList[0];

不会创建该学生的新副本,它只是引用现有的学生。
如果你想创建一个新对象,你必须调用new Student()。这样,您就可以手动复制所有属性。另一种选择是,如果您使用的是C# 9或更高版本,则使用record而不是class。这使您可以访问with关键字,该关键字允许您创建具有相同属性的新对象,同时仅修改所需的属性。举例来说:

var addnewStudent = studentList[0] with
{ 
    Age = 30 
};
jslywgbw

jslywgbw3#

你正在尝试做的事情被称为“肤浅的复制”。也就是说,您将引用复制到实际对象。您需要创建对象的 *Deep副本 *,以将其作为新对象添加到列表中。
你应该试着做:
var addnewStudent = new Student() { StudentName = studentList[0].StudentName ,Section = studentList[0].Section, Age = 30 };
然后将其添加到您的列表中。

lhcgjxsq

lhcgjxsq4#

可以使用Object.MemberwiseClone方法。
您的代码更新list元素的原因是您的studentList是一个references的列表(因为它的元素是Student类的对象)。
你要做的是创建一个对象的副本。如果Student类只有值类型(int、char、string、double等),你可以简单地通过在其中添加一个方法(CreateCopy())来添加新的student:

public Student CreateCopy()
{
   return (Student)this.MemberwiseClone();
}

现在,如果Student类有引用类型字段(即类的示例),那么您必须创建一个副本并为这些字段分配一个新示例。例如,假设您的Student类有一个名为“School”的引用类型字段:

public class Student
{
    public string StudentName { get; set; }
    public string Section { get; set; }
    public int Age { get; set; }
    private School _school;

    public Student(string studentName, string section, int age)
    {
         StudentName = studentName;
         Section = section;
         Age = age;
    }
    
    public Student CreateCopy()
    {
        Student otherStudent = (Student)this.MemberwiseClone();
        //Copy the instances of other classes that are fields
        //You could add a similar method to copy the school instance
        otherStudent.School = new School(_school.Name);
        return otherStudent;
    }
}

然后,您只需执行以下操作即可将副本添加到列表中:

var addnewStudent= studentList[0].CreateCopy(); // Use CreateCopy()
addnewStudent.Age = 30;
studentList.Add(addnewStudent);

此方法的优点是,如果您只向Student添加值类型字段,则CreateCopy()方法保持不变。如果你像其他答案中建议的那样使用复制构造函数,那么每次向类中添加新字段时,你都必须更新它。
虽然不是关于你的问题,但你应该考虑使用抽象类来为学生提供一些 default 值,而不是总是使用列表的第一个元素。

kuuvgm7e

kuuvgm7e5#

我想这是因为你引用了你的第一个对象,而不是创建一个新的对象,试试这个:

static void Main(string[] args)
{
       
    // Student collection
    IList<Student> studentList = new List<Student>() {
        new Student() { StudentName = "John", Section ="A",Age = 13} ,
        new Student() { StudentName = "Moin",Section ="A",  Age = 21 } ,
        new Student() { StudentName = "Bill",Section ="A",  Age = 18 } ,
        new Student() {StudentName = "Ram" ,Section ="A", Age = 20} ,
        new Student() {StudentName = "Ron" ,Section ="A", Age = 15 }
   };

   var addnewStudent=  new Student() { StudentName = "John", Section ="A",Age = 30} 
       
   studentList.Add(addnewStudent);
   Console.WriteLine(studentList);
}

相关问题