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);