2016-03-24 8 views
1

クローン拡張機能を持つ汎用リストを複製しようとしています。リストアイテムに別のリストがある場合は深くクローンします

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<Order>ので、クローンはFilledOrdersリストに対して実行されません入力したFilledOrdersを持って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(); 
    } 
} 

を実装しています。

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クラスで

+1

あなたは自分でやってください。リストのコピーを作るために 'Clone()'にさらにコードを書いてください。それで、あなたが最初にその機能を実装している理由です。あなたはそのようなものの世話をすることができます。 – Nyerguds

答えて

1

、単にリストのクローンを作成するためにあなたの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クラス内のディクショナリオブジェクトは、参照型でもあるため、複製されません。この問題を解決するには、原則は同じです:の機能を展開し、手動でそこにコピーを作成してください。その人のProductアイテムでもクローンを作成する必要がある場合は、ProductクラスにIClonableを実装し、同じことをします。

循環参照がない限り、IClonableをそのまま実装して、Clone()関数で参照型を固定することができます。

+0

はい私の解決策です。私はそれが動作しようとしました。 ;ありがとう@Nyerguds。 –

+1

@erkandemir答えを編集しました、btw。 'Order'クラスの内部で' MemberwiseClone() 'がどのようにそれらの辞書を扱うのかよくわかりません。しかし、私が言ったように、原理はまったく同じです。 – Nyerguds