【问题标题】:C# Deep Clone of a List Data列表数据的 C# 深度克隆
【发布时间】:2026-02-24 11:05:02
【问题描述】:

我有以下属性;

public class Employer
{
public int IDNumber { get; set; }
public DateTime RegDate { get; set; }
public List<BioData> BioInfo { get; set; }
}

BioData.cs

 public class BioData
    {
        public int IndexID { get; set; }
        public string Description { get; set; }
        public int Age { get; set; }
        public double Salary { get; set; }
    }

我想深度克隆雇主列表,包括所有字段和属性到同一个雇主列表。

【问题讨论】:

  • 我尝试将副本和 AddRange 复制到同一个列表中,但没有成功。
  • @SupunSilva 您是否尝试过重复问题的任何答案?
  • 尝试了重复问题中的所有答案。这个问题没有明确的答案。
  • 你要克隆多少数据?

标签: c#


【解决方案1】:

一种方法是为BioData 提供一个复制构造函数。您还应该密封类,因此您不必担心复制派生类数据:

public sealed class BioData
{
    public BioData()
    {
        // Initialise members or not, as you like.
    }

    public BioData(BioData other)
    {
        IndexID     = other.IndexID;
        Description = other.Description;
        Age         = other.Age;
        Salary      = other.Salary;
    }

    public int    IndexID     { get; set; }
    public string Description { get; set; }
    public int    Age         { get; set; }
    public double Salary      { get; set; }
}

然后你可以像这样克隆列表:

var clone = BioInfo.Select(item => new BioData(item)).ToList();

【讨论】:

  • 生物数据列表在单独的文件中
  • @SupunSilva 在您的问题中,您在哪里说明了文件中的数据?您如何期望人们能够回答您尚未提出的问题?请去编辑您的问题并添加所有相关信息!
  • Employer List 有一个名为 BioData 的 subList。我想深度克隆雇主列表,包括所有字段和子列表。
  • @SupunSilva 你能发布具有名为 BioData 的子列表的类的声明吗?
  • 使用上面的代码,我无法向 BioData 添加新项目。 new BioData(){IndexID=1, Description ="112dfdf", ....}
【解决方案2】:

您还可以使用方法或 IClonable 接口来克隆数据。 我更喜欢我自己的方法,名称清晰(浅克隆或深层克隆):

public sealed class Employer
{
    public int IDNumber { get; set; }
    public DateTime RegDate { get; set; }
    public List<BioData> BioInfo { get; set; }

    public Employer DeepClone()
    {
        Employer loClone = new Employer()
        {
            IDNumber = this.IDNumber,
            RegDate = this.RegDate
        };
        if (this.BioInfo != null)
            loClone.BioInfo = this.BioInfo.Select(item => item.DeepClone()).ToList();
        return loClone;
    }
}

public sealed class BioData 
{
    public int IndexID { get; set; }
    public string Description { get; set; }
    public int Age { get; set; }
    public double Salary { get; set; }

    public BioData DeepClone()
    {
        //Can also use here
        //return this.MemberwiseClone() as BioData;
        return new BioData()
        {
            IndexID = this.IndexID,
            Description = String.Copy(this.Description),
            Age = this.Age,
            Salary = this.Salary
        };
    }
}

更新
要从同一列表中的现有列表中复制条目,可以使用 LINQ。 (ToList 是必须的):

List<Employer> loList = new List<Employer>();
loList.ToList().ForEach(item => loList.Add(item.DeepClone()));

【讨论】:

  • 这段代码很好,可以克隆到 1loClone`,我想在现有列表中添加这个克隆数据。