我收到List<List<CustomClass>>
,其中CustomClass
是参考类型。
我需要将这个矩阵的完整深层复制到一个新矩阵中。由于我需要深层复制,因此矩阵中的每个CustomClass对象都必须复制到新矩阵中。
你会如何以有效的方式做到这一点?
答案 0 :(得分:4)
对于实现ICloneable的CustomClass,这不是很困难:
var myList = new List<List<CustomClass>>();
//populate myList
var clonedList = new List<List<CustomClass>>();
//here's the beef
foreach(var sublist in myList)
{
var newSubList = new List<CustomClass>();
clonedList.Add(newSubList);
foreach(var item in sublist)
newSublist.Add((CustomClass)(item.Clone()));
}
如果你觉得你不想实现ICloneable,你可以用任何“DeepCopy”类型的方法以类似的方式工作(我建议使用内置接口)。
答案 1 :(得分:3)
一种更简单的方法序列化整个对象,然后反序列化再次尝试此扩展方法:
public static T DeepClone<T>(this T source)
{
if (!typeof(T).IsSerializable)
{
throw new ArgumentException("The type must be serializable.", "source");
}
// Don't serialize a null object, simply return the default for that object
if (Object.ReferenceEquals(source, null))
{
return default(T);
}
IFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream();
using (stream)
{
formatter.Serialize(stream, source);
stream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(stream);
}
}
<强> USAGE 强>
List<List<CustomClass>> foobar = GetListOfListOfCustomClass();
List<List<CustomClass>> deepClonedObject = foobar.DeepClone();
答案 2 :(得分:1)
有两种可能性:
在CustomClass上实现ICloneable接口,然后您可以克隆对象。
如果可以序列化类,则将其序列化为内存流并从那里反序列化。这将创建它的副本。
我更愿意采用第一种方法,因为我认为序列化/反序列化比通过ICloneable进行克隆要慢。
答案 3 :(得分:1)
假设您有Copy
方法可以复制CustomClass
个对象:
var newMatrix = oldMatrix
.Select(subList => subList.Select(custom => Copy(custom)).ToList())
.ToList();