我有一个学生名单。我想在列表中添加新的对象,但想使用列表的第一项,并更新一些一些字段,然后将其添加为列表中的新对象。但是当我这样做时,它只更新现有的列表,而不是作为新对象添加到列表中。下面是我的代码。这只是一个参考数据。我有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);
}
}
5条答案
按热度按时间c0vxltue1#
我想在列表中添加新的对象,但要使用列表的第一个项目,并更新一些领域,然后将其作为新的对象添加到列表中
如果不使用
new
,你不能添加一个 new 对象,如果你更新一个现有的对象,你不会创建一个新的对象。因此,如果您真的想获取一个现有对象并修改一个属性,那么使用复制构造函数可能是一个好主意。下面是一个示例:这样做的好处是,你不需要复制所有的属性,你想从一个现有的学生创建新的学生,但类本身处理:
krugob8w2#
这一行:
不会创建该学生的新副本,它只是引用现有的学生。
如果你想创建一个新对象,你必须调用
new Student()
。这样,您就可以手动复制所有属性。另一种选择是,如果您使用的是C# 9或更高版本,则使用record
而不是class
。这使您可以访问with
关键字,该关键字允许您创建具有相同属性的新对象,同时仅修改所需的属性。举例来说:jslywgbw3#
你正在尝试做的事情被称为“肤浅的复制”。也就是说,您将引用复制到实际对象。您需要创建对象的 *Deep副本 *,以将其作为新对象添加到列表中。
你应该试着做:
var addnewStudent = new Student() { StudentName = studentList[0].StudentName ,Section = studentList[0].Section, Age = 30 };
然后将其添加到您的列表中。
lhcgjxsq4#
可以使用Object.MemberwiseClone方法。
您的代码更新list元素的原因是您的studentList是一个references的列表(因为它的元素是Student类的对象)。
你要做的是创建一个对象的副本。如果Student类只有值类型(int、char、string、double等),你可以简单地通过在其中添加一个方法(CreateCopy())来添加新的student:
现在,如果Student类有引用类型字段(即类的示例),那么您必须创建一个副本并为这些字段分配一个新示例。例如,假设您的Student类有一个名为“School”的引用类型字段:
然后,您只需执行以下操作即可将副本添加到列表中:
此方法的优点是,如果您只向Student添加值类型字段,则CreateCopy()方法保持不变。如果你像其他答案中建议的那样使用复制构造函数,那么每次向类中添加新字段时,你都必须更新它。
虽然不是关于你的问题,但你应该考虑使用抽象类来为学生提供一些 default 值,而不是总是使用列表的第一个元素。
kuuvgm7e5#
我想这是因为你引用了你的第一个对象,而不是创建一个新的对象,试试这个: