我有一个列表的问题,我想制作原始列表的副本,因为如果我更改列表副本中的值修改原始值,该列表是一个帐单的详细类型,因为我尝试过以下,但不起作用。
List<detail> detail = new List<detail>();
detail = saleController.getAll();
List<detail> copyDetail = new List<detail>(detail);
我很感激帮助解决我的问题
答案 0 :(得分:3)
对于要复制的集合中的每个对象,您可以复制它并将其添加到目标集合中。如何复制该实例可能取决于要复制的实例类型。那个类有没有复制构造函数?
答案 1 :(得分:3)
听起来detail
是引用类型。复制列表时,每个列表(其后备存储是一个数组)包含对同一组detail
实例的引用。
您需要制作深层复制或克隆。
如果detail
实施ICloneable
,则很容易:
List<detail> original = GetListOfDetails() ;
List<detail> clone = original.Select( x => x.Clone() ).Cast<detail>().ToList() ;
但是,您受detail.Clone()
语义的支配:不保证它实际执行深层复制。有关如何实施正确深层复制的一些建议,请参见MemberwiseClone()
。
如果detail
是可序列化的,即类具有属性[Serializable]
或者它实现ISerializable
,那么最简单,最简单(尽管既不优雅也不特别快)的方法是将其序列化为流并将其重新水合为新列表,如下所示:
public static IEnumerable<T> Clone<T>( this IEnumerable<T> list )
{
BinaryFormatter serializer = new BinaryFormatter() ;
using ( MemoryStream stream = new MemoryStream() )
{
foreach( T item in list )
{
// serialize
serializer.Serialize(stream,item) ;
stream.Flush() ; // probably unneeded for a memory stream, but belts-and-suspenders, right?
// rewind and rehydrate
stream.Seek(0,SeekOrigin.Begin) ;
T clone = (T) serializer.Deserialize( stream ) ;
// rewind and clear the memory stream
stream.Seek(0,SeekOrigin.Begin) ;
stream.SetLength(0) ;
yield return clone ;
}
}
}
...
List<detail> original = GetListOfDetails() ;
List<detail> clone = original.Clone().ToList() ;
答案 2 :(得分:0)
List<detail> detail = new List<detail>();
detail = saleController.getAll();
List<detail> copyDetail = new List<detail>();
copyDetail = detail.Clone();
答案 3 :(得分:0)
克隆这样的对象将修改Original对象。您必须使用像ForeEach这样的somthin将原始列表的值复制到另一个:
private void btnCopy_Click(object sender, EventArgs e)
{
List<detail> detail = new List<detail>();
List<detail> CopyDetail = new List<detail>();
detail.Add(new detail{item1=1,item2=1});
foreach (detail item in detail)
{
CopyDetail.Add(new detail{item1=item.item1,item2=item.item2});
}
}
public class detail
{
public int item1;
public int item2;
}