我有Attribut和Values课程。我不知道如何在列表中克隆项目值。
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 :(得分:3)
我认为首先您需要了解浅拷贝和深拷贝之间的差异。
简而言之,第一个只是复制引用(从而使两个对象引用相同的列表),而第二个创建“真正的副本”。
因此,MemberwiseClone
会创建浅层副本,而您似乎需要深层复制。
在大多数情况下,深层复制需要自定义编程,因为只有您知道如何正确创建不同的对象(要使用的构造函数,要复制的属性,要分配的资源等)。
例如,如果您的对象拥有文件处理程序,则由您和您的逻辑决定是否需要在克隆对象之间共享此文件,或者实际克隆文件本身。
因此,在您的情况下,List<Value>
的深层副本可能看起来像这样:
public object Clone()
{
var result = (Attribut)MemberwiseClone();
result.values = values.Select(x => (Values)x.Clone()).ToList();
return result;
}
请务必为您不希望在克隆之间共享的所有列表/对象反映此深层复制逻辑。