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

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

我在C#中有一个对象的通用列表,并希望克隆这个列表。列表中的项目是可圈可点的,但似乎没有一个选项可供选择list.Clone().

有什么简单的办法吗?


跃然一笑
浏览 877回答 3
3回答

ibeautiful

如果您的元素是值类型,那么您可以这样做:List<YourType>&nbsp;newList&nbsp;=&nbsp;new&nbsp;List<YourType>(oldList);但是,如果它们是引用类型,并且您需要一个深度副本(假设您的元素正确地实现了ICloneable),你可以这样做:List<ICloneable>&nbsp;oldList&nbsp;=&nbsp;new&nbsp;List<ICloneable>();List<ICloneable>&nbsp;newList&nbsp;=&nbsp;new&nbsp;List<ICloneable>(oldList.Count);oldList.ForEach((item)&nbsp;=> &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newList.Add((ICloneable)item.Clone()); &nbsp;&nbsp;&nbsp;&nbsp;});显然,替换ICloneable在上面的泛型中,使用实现的任何元素类型进行强制转换。ICloneable.如果元素类型不支持ICloneable但是有一个复制构造函数,您可以这样做:List<YourType>&nbsp;oldList&nbsp;=&nbsp;new&nbsp;List<YourType>();List<YourType>&nbsp;newList&nbsp;=&nbsp;new&nbsp;List<YourType>(oldList.Count);oldList.ForEach((item)=> &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newList.Add(new&nbsp;YourType(item)); &nbsp;&nbsp;&nbsp;&nbsp;});就我个人而言,我会避免ICloneable因为需要保证所有成员都能得到一份深刻的副本。相反,我建议复制构造函数或工厂方法,例如YourType.CopyFrom(YourType itemToCopy)的新实例。YourType.这些选项中的任何一个都可以由方法(扩展或其他方式)包装。

侃侃无极

public&nbsp;static&nbsp;object&nbsp;DeepClone(object&nbsp;obj)&nbsp;{ &nbsp;&nbsp;object&nbsp;objResult&nbsp;=&nbsp;null; &nbsp;&nbsp;using&nbsp;(MemoryStream&nbsp;&nbsp;ms&nbsp;=&nbsp;new&nbsp;MemoryStream()) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;BinaryFormatter&nbsp;&nbsp;bf&nbsp;=&nbsp;&nbsp;&nbsp;new&nbsp;BinaryFormatter(); &nbsp;&nbsp;&nbsp;&nbsp;bf.Serialize(ms,&nbsp;obj); &nbsp;&nbsp;&nbsp;&nbsp;ms.Position&nbsp;=&nbsp;0; &nbsp;&nbsp;&nbsp;&nbsp;objResult&nbsp;=&nbsp;bf.Deserialize(ms); &nbsp;&nbsp;} &nbsp;&nbsp;return&nbsp;objResult;}这是用C#和.NET 2.0实现它的一种方法。你的对象需要[Serializable()]..目标是失去所有的引用并构建新的引用。
打开App,查看更多内容
随时随地看视频慕课网APP