2013-04-10 107 views
0

我有類Attribut和值。我不知道如何克隆列表中的項目值。C#如何克隆列表列表

public class Attribut : ICloneable 
{ 
    public Attribut() 
    { } 

    public Attribut(List<Values> value) 
    { 
     this.Values = value; 
    } 

    public object Clone() 
    { 
     return this.MemberwiseClone(); 
    } 

    //other members 



    List<Values> values = new List<Values>();y 

    public List<Values> Values 
    { 
     get { return values; } 
     set { values = value; } 
    } 
} 


[Serializable] 
public class Values : ICloneable 
{ 
    public Values() 
    { 
    } 

    public Values(string name) 
    { 
     this.Name = name; 
    } 

    public Values(string name, int count) 
    { 
     this.Name = name; 
     this.Count = count; 
    } 

    public object Clone() 
    { 
     return this.MemberwiseClone(); 
    } 

    string name; 

    int count = 0; 



    public int Count 
    { 
     get { return count; } 
     set { count = value; } 
    } 

    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
} 

我有問題克隆值時,我把這種方法(attrList)是全球性的變量) 當我添加新的值到列表中,相同的值也被添加在attrList。

private List<Attribut> getSelectedColumns() 
    { 
     List<Attribut> list = new List<Attribut>(); 

     for (int i = 0; i < listView1.Items.Count; i++) 
     { 
      if (listView1.Items[i].Checked == true) 
      { 
       list.Add((Attribut)attrList[i].Clone()); 
       for(int j= 0; j < attrList[i].Values.Count;j++) 
       { 
        list[j].Values.Add((Values)attrList[i].Values[j].Clone()); 
       } 
      } 
     } 
+0

你的克隆方法是如何定義的? – 2013-04-10 21:34:35

+0

你到底在做什麼?我無法想象它應該是這麼難。 – 2013-04-10 21:42:39

+0

方法在類外觀代碼中定義。我有插件應用程序,我需要發送metada插件。在attrList 都是元數據,並在列表被選中metadata.And我在插件 – Sejnt 2013-04-10 23:28:41

回答

3

我認爲,首先你需要了解淺拷貝深拷貝之間的差異。

總之,第一個只是複製引用(因此使兩個對象引用相同的列表),而第二個創建'真正的副本'。

所以,MemberwiseClone創建淺拷貝,但在我看來,你需要深拷貝。因爲只有你知道如何正確地創建不同的對象(使用哪個構造函數,要複製哪些屬性,分配哪些資源等),需要自定義編程。例如,如果您的對象擁有要處理的處理程序,則取決於您和您的邏輯來決定是否需要在克隆的對象之間共享此文件,或者實際克隆文件本身。

所以你的情況爲List<Value>最有可能深拷貝應該是這樣的一個:

public object Clone() 
    { 
     var result = (Attribut)MemberwiseClone(); 
     result.values = values.Select(x => (Values)x.Clone()).ToList(); 
     return result; 
    } 

一定要反映這種深拷貝邏輯不想克隆之間共享的所有列表/對象。