Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何制作深度复制词典模板_C#_.net_Templates_Dictionary - Fatal编程技术网

C# 如何制作深度复制词典模板

C# 如何制作深度复制词典模板,c#,.net,templates,dictionary,C#,.net,Templates,Dictionary,我有以下方法制作字典的深度副本: public static Dictionary<string, MyClass> deepCopyDic(Dictionary<string, MyClass> src) { //Copies a dictionary with all of its elements //RETURN: // = Dictionary copy Dictionary<string, MyClass>

我有以下方法制作字典的
深度副本

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;
}
公共静态字典deepCopyDic(字典src)
{
//复制字典及其所有元素
//返回:
//=字典副本
Dictionary dic=新字典();
对于(int i=0;i

我在想,我能不能把它做成一个模板?我需要
MyClass
作为模板。

您可以将泛型与
一起使用,其中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不能保证要克隆的对象中的所有属性都不会分配引用,除非您完全控制该对象,这绝不是一个好的假设,尤其是在大型团队中

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


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

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

Dictionary<string, int> copy = new Dictionary<string, int>(dictionary);
字典副本=新字典(字典);
这样你就可以把你的字典复制得很深。
到原始帖子。

。。。什么的模板?@JeremyHolovacs:for
MyClass
成为
MyOtherClass
MyAnotherClass
,等等。你是说抽象类?界面?谢谢。这就是我所缺少的:)所以我可以用
new
和构造函数来复制它,而不是
ICloneable
吗?@ahmd0我要告诉你,你迭代字典的代码非常糟糕,甚至在你做任何事情之前。其次,拷贝不仅仅是深浅的,它更复杂。这是一个滑动比例。你可以复制一本字典的参考资料。您可以创建一个新词典,但只需复制对其中项目的引用即可。你可以创建一个新词典和新条目,但要复制这些条目中的条目引用,等等。“深度复制”意味着要一直到最低级别,而不是在某个较早的点上停止。@ahmd0
只会让我挂起?
在这么多答案/注释之后,我仍然不知道你真正想做什么。你不觉得我对你有问题吗。或者你从抄写字典中了解到了什么?@ahmd0如果只有某个地方可以让你获得几乎任何东西的信息,那我们就称这个虚构的地方为“谷歌”。去这样一个地方可能会让你输入一个单词,比如说“serialization”,也许还有一些额外的上下文,比如说“serialization C#”,然后立即获得数百万详细的、著名的资源的引用,这些资源描述了这个概念是什么,以及你如何使用它。有这么一个神奇工具的神话世界不是很奇妙吗?哦,我忘了提了。字典是不可序列化的。因此,如果计划使用可序列化技术,则需要迭代字典中的所有对象。
Dictionary<string, int> copy = new Dictionary<string, int>(dictionary);