如果列表项有另一个列表,则深度克隆
Deep Clone If List Item Has Another List
我正在尝试使用克隆扩展名克隆通用列表。
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();
}
我实现了 Vehicle 对象 ICloneable
public class Vehicle : ICloneable
{
[Key]
public int VehicleId { get; set; }
public string Plaka { get; set; }
public double Volume { get; set; }
public double FilledVolume { get; set; }
public double DepartureTime { get; set; }
public double IdleVolume
{
get { return this.Volume - this.FilledVolume; }
set { }
}
public double FilledWeight { get; set; }
public double IdleWeight {
get { return this.WeightCapacity - this.FilledWeight; }
set{}
}
public decimal ConstantCost { get; set; }
public string VehicleType { get; set; }
public string Model { get; set; }
public bool IsRent { get; set; }
public double AvgVelocity { get; set; }
public decimal CostPerKilometer { get; set; }
public double WeightCapacity { get; set; }
public bool InProgress { get; set; }
public List<Order> FilledOrders { get; set; }
public object Clone()
{
return this.MemberwiseClone();
}
}
扩展克隆我的列表,但车辆对象有 FilledOrders 属性 键入 List<Order>
因此克隆不会执行 FilledOrders 列表。
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();
}
}
如果列表项有另一个列表,克隆的解决方案是什么?
在 Vehicle
class 中,只需扩展 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;
}
毕竟,这就是实施 IClonable 的全部意义所在。否则你可以在任何事情上调用 MemberwiseClone()
。
Order
class 中的字典对象也不会被克隆,顺便说一句,因为它们也是引用类型。要解决这个问题,原理是一样的:扩展 Order
的 Clone()
函数并在其中手动创建它们的副本。如果甚至有必要克隆那个 Product
项目,请在 Product
class 中实施 IClonable
并在那里执行相同的操作。
只要不存在循环引用,你就可以继续实现IClonable
并修复Clone()
函数中的引用类型。
我正在尝试使用克隆扩展名克隆通用列表。
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();
}
我实现了 Vehicle 对象 ICloneable
public class Vehicle : ICloneable
{
[Key]
public int VehicleId { get; set; }
public string Plaka { get; set; }
public double Volume { get; set; }
public double FilledVolume { get; set; }
public double DepartureTime { get; set; }
public double IdleVolume
{
get { return this.Volume - this.FilledVolume; }
set { }
}
public double FilledWeight { get; set; }
public double IdleWeight {
get { return this.WeightCapacity - this.FilledWeight; }
set{}
}
public decimal ConstantCost { get; set; }
public string VehicleType { get; set; }
public string Model { get; set; }
public bool IsRent { get; set; }
public double AvgVelocity { get; set; }
public decimal CostPerKilometer { get; set; }
public double WeightCapacity { get; set; }
public bool InProgress { get; set; }
public List<Order> FilledOrders { get; set; }
public object Clone()
{
return this.MemberwiseClone();
}
}
扩展克隆我的列表,但车辆对象有 FilledOrders 属性 键入 List<Order>
因此克隆不会执行 FilledOrders 列表。
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();
}
}
如果列表项有另一个列表,克隆的解决方案是什么?
在 Vehicle
class 中,只需扩展 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;
}
毕竟,这就是实施 IClonable 的全部意义所在。否则你可以在任何事情上调用 MemberwiseClone()
。
Order
class 中的字典对象也不会被克隆,顺便说一句,因为它们也是引用类型。要解决这个问题,原理是一样的:扩展 Order
的 Clone()
函数并在其中手动创建它们的副本。如果甚至有必要克隆那个 Product
项目,请在 Product
class 中实施 IClonable
并在那里执行相同的操作。
只要不存在循环引用,你就可以继续实现IClonable
并修复Clone()
函数中的引用类型。