簡體   English   中英

C#如何克隆列表列表

[英]C# how to clone List of Lists

我上課的屬性和價值觀。 我不知道如何在列表中克隆項目值。

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());
                }
            }
        }

我認為首先您需要了解淺拷貝深拷貝之間的區別。

簡而言之,第一個僅復制引用(因此創建兩個引用相同列表的對象),而第二個創建“真實副本”。

因此, MemberwiseClone創建淺表副本 ,而您似乎需要深表副本

在大多數情況下, 深層復制需要自定義編程,因為只有您知道如何正確創建不同的對象(要使用的構造函數,要復制的屬性,要分配的資源等)。

例如,如果您的對象擁有要處理的文件,則由您和您的邏輯來決定是否需要在克隆的對象之間共享此文件,或者實際克隆文件本身。

因此,在您的情況下,很可能List<Value>深層副本應如下所示:

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

對於不想在克隆之間共享的所有列表/對象,請確保反映出這種深層復制邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM