将列表复制到另一个列表

时间:2014-05-06 00:25:23

标签: c# list copy

我有一个列表的问题,我想制作原始列表的副本,因为如果我更改列表副本中的值修改原始值,该列表是一个帐单的详细类型,因为我尝试过以下,但不起作用。

List<detail> detail = new List<detail>(); 
detail = saleController.getAll();
List<detail> copyDetail = new List<detail>(detail);

我很感激帮助解决我的问题

4 个答案:

答案 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;
}