有序字典的深层副本

本文关键字:副本 字典 | 更新日期: 2023-09-27 18:31:43

创建 OrderedDictionary 的深层副本的最简单方法是什么?我尝试像这样创建一个新变量:

var copy = dict[x] as OrderedDictionary;

但是如果我更新副本中的值/键,dict[x] 中的字典也会更新。

编辑:dict是另一个OrderedDictionary。

有序字典的深层副本

您应该能够使用通用的深度克隆方法。来自 msdn 杂志的深度克隆示例:

Object DeepClone(Object original)
{
    // Construct a temporary memory stream
    MemoryStream stream = new MemoryStream();
    // Construct a serialization formatter that does all the hard work
    BinaryFormatter formatter = new BinaryFormatter();
    // This line is explained in the "Streaming Contexts" section
    formatter.Context = new StreamingContext(StreamingContextStates.Clone);
    // Serialize the object graph into the memory stream
    formatter.Serialize(stream, original);
    // Seek back to the start of the memory stream before deserializing
    stream.Position = 0;
    // Deserialize the graph into a new set of objects
    // and return the root of the graph (deep copy) to the caller
    return (formatter.Deserialize(stream));
}

你在字典中存储了什么类型的对象?

您需要遍历字典的内容并以某种方式克隆/复制内容。

如果你的对象实现了ICloneable你可以做类似的事情,

Dictionary<int, MyObject> original = new Dictionary<int, MyObject>();
... code to populate original ...
Dictionary<int, MyObject> deepCopy = new Dictionary<int, MyObject>();
foreach(var v in a)
{
    MyObject clone = v.Value.Clone();
    b.Add(v.Key, clone);
}

我无法从你的问题中看出dict是字典吗?创建集合的深层副本的最简单方法是循环访问其成员并克隆每个成员。

如果你的值实现了 ICloneable:

OrderedDictionary newDict = new OrderedDictionary();
foreach(DictionaryEntry entry in OriginalDictionary)
{
     newDict[entry.Key] = entry.Value.Clone();
}

如果你的值不能是 Clone()d,你必须以另一种方式复制它们。

OrderedDictionary newDict = new OrderedDictionary();
foreach(DictionaryEntry entry in OriginalDictionary)
{
     MyClass x = new MyClass();
     x.myProp1 = entry.Value.myProp1 as primitive value;
     x.myProp2 = entry.Value.myProp2 as primitive value;
     newDict[entry.Key] = x;
}