C#向List<T>添加含List属性的引用对象时如何避免列表内容同步变动?
解决方法
你遇到的问题核心是引用类型赋值时仅传递内存地址,没有复制实际的集合内容,只需要给Attribute1赋值时创建List<B>的独立副本即可,常见实现方案如下:
- 方案一:集合浅拷贝(适用于仅需隔离集合增删操作的场景)
如果B是值类型,或者B是引用类型但你不会修改B实例的内部属性,仅需要保证集合的元素增删不会互相影响,直接调用LINQ的ToList()方法创建集合副本即可,修改后代码如下:
List<A> listA = new List<A>(); List<B> listB = SomeFuncReturnsListB(); A a = new A(); // 调用ToList()创建listB的独立副本 a.Attribute1 = listB.ToList(); // 存入listA时再创建副本,避免和a实例的Attribute1互相影响 listA.Add(new A(){Attribute1 = a.Attribute1.ToList()});
说明:
ToList()会遍历原集合的所有元素,生成一个全新的List实例,新实例和原实例的增删操作完全独立。
- 方案二:深拷贝(适用于需要完全隔离数据的场景)
如果B是引用类型,且后续会修改B实例的内部属性,需要实现深拷贝保证数据完全独立:
- 给
B类添加深拷贝方法:
public class B { public int Id { get; set; } public string Name { get; set; } // 其他属性 public B DeepCopy() { return new B { Id = this.Id, Name = this.Name // 逐一赋值所有属性即可 }; } }
- 赋值时对每个
B实例做拷贝:
a.Attribute1 = listB.Select(item => item.DeepCopy()).ToList(); listA.Add(new A(){Attribute1 = a.Attribute1.Select(item => item.DeepCopy()).ToList()});
内容的提问来源于stack exchange,提问作者elizzybeth13
相关产品推荐
相关产品推荐

