C# 嵌套对象列表List<List<T>>添加项同步到所有子列表如何解决?
问题根源
List<T>属于引用类型,你当前实现中所有添加到Contacts主列表的子列表,本质都指向同一个PersonalContacts实例,因此只要修改任意一个子列表的内容,所有子列表都会同步变动。你之前的Clear操作也只是清空了同一个实例的内容,并没有创建独立的子列表实例。
调整方案
核心逻辑是:每次添加新子列表、操作指定索引的子列表时,都使用独立的List<Template>实例,不要复用全局的PersonalContacts对象。
1. 修正单例类定义
首先修正原代码的拼写错误,同时移除全局公用的PersonalContacts避免引用复用:
public sealed class RepositoryContacts { // 主列表,存储所有独立的子列表实例 public List<List<Template>> Contacts = new List<List<Template>>(); // 修正原拼写错误:原代码多写了一个字母c,类型名和类名保持一致 public static RepositoryContacts Instancia = new RepositoryContacts(); private RepositoryContacts() { } }
2. 调整子列表初始化逻辑
新增子列表时直接创建新的List<Template>实例,不需要复用全局对象:
PlantillaContactos contact = new PlantillaContactos { Name = "", LastName = "", Address = "", }; // 创建独立的临时子列表实例 var tempList = new List<Template>(); tempList.Add(contact); // 将独立实例添加到主列表 RepositoryContacts.Instancia.Contacts.Add(tempList); // 清空当前独立实例的内容,不会影响主列表中的其他子列表 tempList.Clear();
3. 调整元素添加逻辑
直接操作目标索引对应的独立子列表,不要中转赋值,同时修正原代码的属性名拼写错误:
public void Add(int index, string name, string lastname, string address) { PlantillaContactos contacto = new PlantillaContactos { Name = name, LastName = lastname, Address = address, }; // 直接给目标索引的子列表添加元素,该子列表是独立实例,不会影响其他子列表 // 修正原代码的拼写错误:原属性名为Contacts不是Contactos RepositoryContacts.Instancia.Contacts[index].Add(contacto); }
序列化适配说明
当前调整后的所有子列表都是独立的实例,不存在多引用指向同一个对象的问题,完全符合序列化操作的要求。如果后续需要复制已有子列表的内容生成新的子列表,使用var newList = new List<Template>(oldList)创建副本即可,不要直接赋值引用。
内容的提问来源于stack exchange,提问作者Abx Medina
相关产品推荐
相关产品推荐

