为了账号安全,请及时绑定邮箱和手机立即绑定

如何在C#中克隆泛型列表?

如何在C#中克隆泛型列表?

跃然一笑 2019-06-20 16:39:15
如何在C#中克隆泛型列表?我在C#中有一个对象的通用列表,并希望克隆这个列表。列表中的项目是可圈可点的,但似乎没有一个选项可供选择list.Clone().有什么简单的办法吗?
查看完整描述

3 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

如果您的元素是值类型,那么您可以这样做:

List<YourType> newList = new List<YourType>(oldList);

但是,如果它们是引用类型,并且您需要一个深度副本(假设您的元素正确地实现了ICloneable),你可以这样做:

List<ICloneable> oldList = new List<ICloneable>();List<ICloneable> newList = new List<ICloneable>(oldList.Count);oldList.ForEach((item) =>
    {
        newList.Add((ICloneable)item.Clone());
    });

显然,替换ICloneable在上面的泛型中,使用实现的任何元素类型进行强制转换。ICloneable.

如果元素类型不支持ICloneable但是有一个复制构造函数,您可以这样做:

List<YourType> oldList = new List<YourType>();List<YourType> newList = new List<YourType>(oldList.Count);oldList.ForEach((item)=>
    {
        newList.Add(new YourType(item));
    });

就我个人而言,我会避免ICloneable因为需要保证所有成员都能得到一份深刻的副本。相反,我建议复制构造函数或工厂方法,例如YourType.CopyFrom(YourType itemToCopy)的新实例。YourType.

这些选项中的任何一个都可以由方法(扩展或其他方式)包装。


查看完整回答
反对 回复 2019-06-20
?
侃侃无极

TA贡献2051条经验 获得超10个赞

public static object DeepClone(object obj) {
  object objResult = null;
  using (MemoryStream  ms = new MemoryStream())
  {
    BinaryFormatter  bf =   new BinaryFormatter();
    bf.Serialize(ms, obj);

    ms.Position = 0;
    objResult = bf.Deserialize(ms);
  }
  return objResult;}

这是用C#和.NET 2.0实现它的一种方法。你的对象需要[Serializable()]..目标是失去所有的引用并构建新的引用。


查看完整回答
反对 回复 2019-06-20
  • 3 回答
  • 0 关注
  • 876 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信