C# 如果列表项有其他列表,则进行深度克隆

C# 如果列表项有其他列表,则进行深度克隆,c#,asp.net,deep-copy,C#,Asp.net,Deep Copy,我正在尝试用克隆扩展名克隆通用列表 List<Vehicle> newList = currentVehicleList.Clone().ToList(); public static IList<T> Clone<T>(this IList<T> listToClone) where T : ICloneable { return listToClone.Select(item => (T)item.Clone()).ToList

我正在尝试用克隆扩展名克隆通用列表

List<Vehicle> newList = currentVehicleList.Clone().ToList();

public static IList<T> Clone<T>(this IList<T> listToClone) where T : ICloneable
{
    return listToClone.Select(item => (T)item.Clone()).ToList();
}
扩展克隆我的列表,但车辆对象具有Filled Orders属性类型
list
,因此克隆不会对Filled Orders列表执行

public class Order : ICloneable
{
    [Key]
    public int OrderId { get; set; }
    public Customer Customer { get; set; }
    public bool IsTwoWayDirection { get; set; }
    public DateTime DeliveryDate { get; set; }
    public Dictionary<Product,int> OrderedProducts { get; set; }
    public Dictionary<Product, int> ReOrderedProducts { get; set; }
    public Double DemandTotalWeigth { get; set; }
    public Double DemandTotalVolume { get; set; }
    public Double PickupTotalWeigth { get; set; }
    public Double PickupTotalVolume { get; set; }
    public double EarliestArrivedTime { get; set; }
    public double ArrivedTime { get; set; }
    //TODO :Timespana cevrilecek
    public Double AcceptStartDate { get; set; }
    public Double AcceptEndDate { get; set; }
    public Double ServiceTime { get; set; }
    //

    public object Clone()
    {
        return this.MemberwiseClone();
    }
}
公共类顺序:可克隆
{
[关键]
公共int-OrderId{get;set;}
公共客户客户{get;set;}
公共布尔值IsTwoWayDirection{get;set;}
public DateTime DeliveryDate{get;set;}
公共字典OrderedProducts{get;set;}
公共字典重新排序产品{get;set;}
公共双需求总宽度{get;set;}
公共双需求总体积{get;set;}
公共双拾音器TalWeigth{get;set;}
公共双PickupTotalVolume{get;set;}
公共双EarliesTarRiveTime{get;set;}
公共双到达时间{get;set;}
//待办事项:Timespana cevrilecek
公共双接受起始日期{get;set;}
公共双AcceptEndDate{get;set;}
公共双服务时间{get;set;}
//
公共对象克隆()
{
返回此.MemberwiseClone();
}
}

如果列表项有另一个列表,克隆的解决方案是什么

Vehicle
类中,只需展开
Clone()
函数即可克隆列表:

public object Clone()
{
    Vehicle clone = this.MemberwiseClone();
    List<Order> clonedOrders = new List<Order>();
    foreach (Order order in this.FilledOrders)
        clonedOrders.Add((Order)order.Clone());
    clone.FilledOrders = clonedOrders;
    return clone;
}
公共对象克隆()
{
车辆克隆=此.MemberwiseClone();
List clonedOrders=新列表();
foreach(在此.FilledOrders中的订单)
添加((Order)Order.Clone());
clone.FilledOrders=clonedOrders;
返回克隆;
}
毕竟,这就是实现IClonable的全部意义所在。否则,您可以对任何内容调用
MemberwiseClone()

顺便说一下,
Order
类中的Dictionary对象也不会被克隆,因为它们也是引用类型。要解决这个问题,原理是一样的:展开
Order
Clone()
函数,并在其中手动创建它们的副本。如果有必要克隆某个人的
产品
项,请在
产品
类中实现
IClonable
,并在该类中执行同样的操作


只要没有循环引用,您就可以继续实现
IClonable
并在
Clone()
函数中修复引用类型。

只要。。。你自己做吧。在
Clone()
中编写更多代码以复制列表。这就是为什么你首先要实现这个功能,你知道;所以你可以处理这样的事情。是的,这是我的解决方案。我试过了;谢谢@Nyerguds@erkandemir我编辑了答案,顺便说一句。我不知道
MemberwiseClone()
如何处理
Order
类中的那些词典。但正如我所说,那里的原则是完全相同的。
public object Clone()
{
    Vehicle clone = this.MemberwiseClone();
    List<Order> clonedOrders = new List<Order>();
    foreach (Order order in this.FilledOrders)
        clonedOrders.Add((Order)order.Clone());
    clone.FilledOrders = clonedOrders;
    return clone;
}