You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 13:51:01