在 C# 中不使用序列化的值复制
Value copy without using serialization in c#
我有两个列表,我正在尝试将源复制到目标。在新的迭代中,更改源会影响目标。我明白了,我正在制作参考副本。有没有办法在不使用任何序列化程序的情况下进行深度复制(由于性能问题)。请在下面找到我的代码
public void ListFiller()
{
newListCopy = new List<KeyValuePair<string, object>>(newList);
}
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。
我有两个列表,我正在尝试将源复制到目标。在新的迭代中,更改源会影响目标。我明白了,我正在制作参考副本。有没有办法在不使用任何序列化程序的情况下进行深度复制(由于性能问题)。请在下面找到我的代码
public void ListFiller()
{
newListCopy = new List<KeyValuePair<string, object>>(newList);
}
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。