【问题标题】:How to make a deep copy Dictionary template如何制作深拷贝字典模板
【发布时间】:2013-04-11 18:40:00
【问题描述】:

我有以下方法可以生成字典的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 作为模板。

【问题讨论】:

  • ...什么模板?
  • @JeremyHolovacs:对于MyClassMyOtherClassMyAnotherClass
  • 你的意思是一个抽象类?接口?

标签: c# .net templates dictionary


【解决方案1】:

您可以使用带有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());
}

【讨论】:

  • 谢谢。这就是我所缺少的:)
  • 那么我可以用new和构造函数来代替ICloneable吗?
  • @ahmd0 我告诉你,你的迭代字典的代码非常糟糕,甚至在你对它做任何事情之前。其次,副本不只是深或浅,它比这更复杂。这是一个滑动规模。您可以复制对字典的引用。您可以创建一个新字典,但只需将引用复制到其中的项目。您可以创建一个新字典和新项目,但复制这些项目中项目的引用等。“深度复制”意味着一直到最低级别,而不是在更早的时候停止。
  • @ahmd0 only to leave me hanging? 在这么多答案/cmets 之后,我仍然不知道您真正想要做什么。你不觉得我可能是你的问题。或者你从复制字典中了解了什么?。
  • @ahmd0 如果有一个地方你可以去获取几乎任何东西的信息,让我们称这个地方为“谷歌”。去这样的地方可能会让你输入一个词,比如“序列化”,也许还有一些额外的上下文,比如“序列化 C#”,然后立即获得数百万对详细和有信誉的资源的引用,这些资源描述了这个概念是什么,以及你如何能去使用它。拥有如此神奇工具的神话世界岂不是很美妙。
【解决方案2】:

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

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

通过这种方式,您可以制作字典的深层副本。 Link 原帖。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 哦,我忘了说。字典不可序列化。因此,如果您打算使用 Serializable 技术,则需要迭代 Dictionary 中的所有对象。
    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2012-06-01
    • 2017-05-13
    • 1970-01-01
    • 2020-11-06
    • 2011-04-29
    • 1970-01-01
    相关资源
    最近更新 更多