我有两个列表,我正在尝试将源复制到目标。在新的迭代中,更改源会影响目标。我明白了,我正在制作参考副本。有没有办法在不使用任何序列化程序的情况下进行深层复制(由于性能问题)。请在下面找到我的代码
public void ListFiller()
{
newListCopy = new List<KeyValuePair<string, object>>(newList);
}
答案 0 :(得分:1)
KeyValuePair
是结构,因此将被重新创建。但是,不会重新创建KeyValuePair
的值,因为它们是引用类型。因此,在两个数据结构中仍然引用相同的实例。
要解决的高效方法是实现IClonable
(或自定义克隆方法)并手动创建对象的深层克隆。但是,这非常耗时,如果对象结构发生更改,则必须维护克隆方法:
public void ListFiller()
{
newListCopy = new List<KeyValuePair<string, object>>();
foreach (var pair in newList)
{
var clone = (pair.Value as IClonable)?.Clone();
// handle case that the object does not implement IClonable
newListCopy.Add(new KeyValuePair<string, object>(pair.Key, clone );
}
}
正如您已经提到的,更简单的方法是,使用序列化来重新创建整个数据结构。这是相对容易实现但不是那么高效(实际上是一个问题?)并且对象需要可序列化。
互联网上充满了similar questions and solutions。