-2

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

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

    return dic;
}

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

4

3 回答 3

6

您可以使用带有where TValue : ICloneable约束的泛型:

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

    return dic;
}

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

或者稍微改进的版本,Key也克隆了:

public static Dictionary<TKey, TValue> deepCopyDic<TKey, TValue>(Dictionary<TKey, TValue> src)
    where TValue : ICloneable
    where TKey : ICloneable
{
    return src.ToDictionary(i => (TKey)i.Key.Clone(), i => (TValue)i.Value.Clone());
}
于 2013-04-11T18:43:47.740 回答
2

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

Dictionary<string, int> copy = new Dictionary<string, int>(dictionary);

通过这种方式,您可以制作字典的深层副本。 链接到原始帖子。

于 2015-11-16T09:17:12.020 回答
1

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

序列化方法的唯一需要注意的是字典中传递的所有对象都是可序列化的。此外,由于过度使用反射,序列化并不总是非常有效,这不应该在代码的高性能区域中使用。

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

于 2013-04-11T19:09:01.590 回答