[英]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.