如何制作深拷贝字典模板

我有以下方法来制作字典的deep copy

 public static Dictionary deepCopyDic(Dictionary src) { //Copies a dictionary with all of its elements //RETURN: // = Dictionary copy Dictionary dic = new Dictionary(); for (int i = 0; i < src.Count; i++) { dic.Add(src.ElementAt(i).Key, new MyClass(src.ElementAt(i).Value)); } return dic; } 

我想知道,我可以以某种方式将其变成模板吗? 我需要MyClass作为模板。

你可以where TValue : ICloneable使用where TValue : ICloneable约束:

 public static Dictionary deepCopyDic(Dictionary src) where TValue : ICloneable { //Copies a dictionary with all of its elements //RETURN: // = Dictionary copy Dictionary dic = new Dictionary(); foreach (var item in src) { dic.Add(item.Key, (TValue)item.Value.Clone()); } return dic; } 

您必须在要传递给该方法的每个类中实现ICloneable接口。

或者有点改进的版本, Key克隆了:

 public static Dictionary deepCopyDic(Dictionary src) where TValue : ICloneable where TKey : ICloneable { return src.ToDictionary(i => (TKey)i.Key.Clone(), i => (TValue)i.Value.Clone()); } 

您可以使用复制构造函数选项:

 Dictionary copy = new Dictionary(dictionary); 

这样您就可以复制字典。 链接到原始post。

如上所述,序列化方法是唯一的方法。 ICloneable并不保证被克隆对象中的所有属性都不会分配引用,除非您完全控制对象,这绝不是一个好的假设,尤其是在大型团队中。

序列化方法的唯一缺点是在字典中传递的所有对象都是可序列化的。 此外,序列化并不总是非常有效,因为过度使用了reflection,不应该在高性能代码区域中使用。

我使用称为快速序列化的方法解决了这个问题,但它要求您计划克隆的所有对象都支持特定的接口。 它总是速度与复杂性。