【问题标题】:Deep cloning List Object深度克隆列表对象
【发布时间】:2025-12-22 11:40:06
【问题描述】:

我需要知道如何深度克隆List <Business> 对象。我尝试了以下方法:

List< Business> owner = bus.Select(m => new Business{
    Businessname= m.Businessname,
    Locations= m.Locations,

 }).ToList();

我从owner 对象中删除了一个对象(Locations - Locations 是一个List &lt;Country&gt;)。我预计bus 对象在我克隆它时不会发生任何变化,如上面的代码所示。

但是,对象Locations 也已从bus 对象中删除。谁能告诉我如何解决这个问题?

【问题讨论】:

  • Locations= m.Locations,,这绝不是一个克隆,这只是一个参考分配。如果要克隆,则需要执行 m.Locations.Select(l =&gt; new Country { ... }).ToList() 之类的操作
  • 我收到一个错误。在owner 对象中还有一些Locationsnull。因此,当它尝试克隆 Country 时会遇到错误。我怎样才能防止这种情况发生?帮助
  • @SiavashGhanbari 您是否阅读了上面分享的内容。它是在 Python 而不是 C# 中。
  • 那是我的错,我删除了标记和评论@sharonHwk
  • 这方面有什么帮助吗?

标签: c# list collections clone


【解决方案1】:

深度克隆几乎任何对象或数据结构的最简单和最通用的方法是将其序列化和反序列化。 Newtonsoft JSON 非常快速和智能,足以处理循环引用、接口类型字段等复杂场景。

var str = JsonConvert.SerializeObject(myList);
var deepCopy = JsonConvert.DeserializeObject<List<MyObject>>(str);

但是,这可能不是最快的方法,因为它会做很多额外的工作和分配。

【讨论】:

    【解决方案2】:

    您应该按如下方式执行克隆操作:

    List< Business> owner = bus.Select(m => new Business
    {
        Businessname = m.Businessname,
        Locations = m.Locations?.Select(l => new Country { /*here goes your initialization*/})
    })
    .ToList();
    

    操作符?进行空检查,如果Locations字段为null则停止执行并返回null,否则执行Select操作。

    请注意,如果Country 对象还包含引用类型字段,则应显式创建该对象并复制所有字段。

    【讨论】: