我想要克隆一个List你只需要调用:
List<int> cloneList = new List<int>(originalList);
Run Code Online (Sandbox Code Playgroud)
但是我在我的代码中尝试了这一点,我似乎得到的效果暗示上面只是在做:
cloneList = originalList ...因为对cloneList的更改似乎正在影响originalList.
那么克隆List的方法是什么?
编辑:
我在考虑做这样的事情:
public static List<T> Clone<T>(this List<T> originalList) where T : ICloneable
{
return originalList.ConvertAll(x => (T) x.Clone());
}
Run Code Online (Sandbox Code Playgroud)
EDIT2:
我拿了Binoj Antony建议的深拷贝代码并创建了这个扩展方法:
public static T DeepCopy<T>(this T original) where T : class
{
using (MemoryStream memoryStream = new MemoryStream())
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, original);
memoryStream.Seek(0, SeekOrigin.Begin);
return (T)binaryFormatter.Deserialize(memoryStream);
}
}
Run Code Online (Sandbox Code Playgroud)
EDIT3:
现在,假设列表中的项目是结构.如果我打电话会怎么样?:
List<StructType> cloneList = new List<StructType>(originalList);
Run Code Online (Sandbox Code Playgroud)
我非常肯定,我会得到一个填充了新的独特项目的列表,对吗?
我正在尝试优化克隆对象的一段代码:
#region ICloneable
public object Clone()
{
MemoryStream buffer = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(buffer, this); // takes 3.2 seconds
buffer.Position = 0;
return formatter.Deserialize(buffer); // takes 2.1 seconds
}
#endregion
Run Code Online (Sandbox Code Playgroud)
很标准的东西.问题是该对象非常强大,需要5.4秒(根据ANTS Profiler - 我确信有探测器开销,但仍然).
是否有更好,更快的克隆方式?
我有以下代码将List序列化为字节数组,以通过Web服务进行传输。该代码在较小的实体上工作相对较快,但这是一个大约60,000个项目的列表。执行formatter.Serialize方法需要几秒钟。无论如何要加快速度?
public static byte[] ToBinary(Object objToBinary)
{
using (MemoryStream memStream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
formatter.Serialize(memStream, objToBinary);
memStream.Seek(0, SeekOrigin.Begin);
return memStream.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud) 请考虑以下相关问题:深度克隆对象
这真的是克隆对象的最佳方法吗?化(serialize /反序列化).序列化对我来说似乎有点贵.
我的想法是创建第二个构造函数并只分配所有变量.这种方法会更快吗?
class Test
{
public Test(Test clone)
{
// clone ....
}
}
Run Code Online (Sandbox Code Playgroud)