【发布时间】:2016-09-08 11:08:26
【问题描述】:
我有一个列表,有 11k 项,列表在初始化时填充,我需要传递一个函数的副本,该函数将修改传递的列表项而不修改原始副本,
到目前为止,我发现的唯一方法是将列表逐项复制到另一个列表,每次创建新的 custom_class() 消耗约 50 毫秒,这在我的情况下是不可接受的。
到目前为止我尝试的是:
AnotherOriginal = Original.AsReadOnly().tolist();
copy = original.tolist();
修改copy[0].testvariable 将同时修改:AnotherOriginal 和 original。
和
我也试过了
ImmutableList test = original.ToImmutableList()
修改test[0].testvariable也会反映到原来的!
在不必将项目逐个添加到另一个列表的情况下,将副本传递给函数的最快方法是什么?防止修改原始列表。
当前的深拷贝代码(我需要增强):
List<FP_Point> particles = new List<FP_Point>();
foreach (FP_Point p in originalParticles)
{
particles.Add(new FP_Point() { ID = p.ID, ZonesIDs = p.ZonesIDs, Location = new Point(p.Location.X, p.Location.Y), Readings = p.GetReadings() });
}
return particles;
自定义类:
public class FP_Point
{
public int ID { get; set; }
public Point Location { get; set; }
public List<Reading> Readings { get; set; }
public double Weight, Distance;
public List<int> ZonesIDs;
public double PreviousDistance;
}
【问题讨论】:
-
拷贝有两种:浅拷贝和深拷贝。您必须使用深拷贝来防止您的数组列表之间的引用。试试这个:stackoverflow.com/questions/18066429/shallow-copy-or-deep-copy
-
ToList()将创建一个新列表,但两个列表都包含对相同对象的引用。您的 foreach 循环会复制这些对象,这就是它起作用的原因。